Skip to content

inherent_to_string doesn't check for unsafe #11201

@morrisonlevi

Description

@morrisonlevi

Summary

The lint clippy::inherent_to_string still applies even if the function is marked unsafe, which obviously cannot then be impl ToString.

The example provides a motivating reason for why the unsafe is important: the struct is used across an FFI boundary.

Lint Name

inherent_to_string

Reproducer

Example src/lib.rs:

use core::marker::PhantomData; use libc::{c_char, size_t}; #[repr(C)] pub struct StringView<'a> { ptr: *const c_char, len: size_t, _marker: PhantomData<&'a [c_char]>, } impl<'a> StringView<'a> { /// # Safety  /// The view must follow all requirements of [std::slice::from_raw_parts].  pub unsafe fn to_string(self) -> String { let slice = std::slice::from_raw_parts(self.ptr as *const u8, self.len); String::from_utf8_lossy(slice).to_string() } }

And Cargo.toml:

[package] name = "clippy_inherent_to_string" version = "0.1.0" edition = "2021" [dependencies] libc = "0.2.147"

I saw this happen:

warning: implementation of inherent method `to_string(&self) -> String` for type `StringView<'a>` --> src/lib.rs:14:5 | 14 | / pub unsafe fn to_string(self) -> String { 15 | | let slice = std::slice::from_raw_parts(self.ptr as *const u8, self.len); 16 | | String::from_utf8_lossy(slice).to_string() 17 | | } | |_____^ | = help: implement trait `Display` for type `StringView<'a>` instead = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#inherent_to_string = note: `#[warn(clippy::inherent_to_string)]` on by default warning: `clippy_inherent_to_string` (lib) generated 1 warning Finished dev [unoptimized + debuginfo] target(s) in 0.00s 

I expected no error, because unsafe means this signature is not applicable for the trait ToString.

Version

rustc 1.71.0 (8ede3aae2 2023-07-12) binary: rustc commit-hash: 8ede3aae28fe6e4d52b38157d7bfe0d3bceef225 commit-date: 2023-07-12 host: aarch64-apple-darwin release: 1.71.0 LLVM version: 16.0.5 

Additional Labels

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't have

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions