-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Open
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thingE-hardCall for participation: This a hard problem and requires more experience or effort to work onCall for participation: This a hard problem and requires more experience or effort to work onI-false-positiveIssue: The lint was triggered on code it shouldn't haveIssue: The lint was triggered on code it shouldn't haveT-middleType: Probably requires verifiying typesType: Probably requires verifiying types
Description
Suppose we start with the following code:
use std::rc::Rc;
pub trait Trait {}
pub fn eq(a: Rc<dyn Trait>, b: Rc<dyn Trait>) -> bool {
Rc::ptr_eq(&a, &b)
}
error: comparing trait object pointers compares a non-unique vtable address
--> src/lib.rs:4:5
|
4 | Rc::ptr_eq(&a, &b)
| ^^^^^^^^^^^^^^^^^^
|
= note: `#[deny(clippy::vtable_address_comparisons)]` on by default
= help: consider extracting and comparing data pointers only
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#vtable_address_comparisons
Okay, let’s do that:
pub fn eq(a: Rc<dyn Trait>, b: Rc<dyn Trait>) -> bool {
&*a as *const dyn Trait as *const u8 == &*b as *const dyn Trait as *const u8
}
warning: use `std::ptr::eq` when comparing raw pointers
--> src/lib.rs:4:5
|
4 | &*a as *const dyn Trait as *const u8 == &*b as *const dyn Trait as *const u8
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: try: `std::ptr::eq(&*a as *const dyn Trait, &*b as *const dyn Trait)`
|
= note: `#[warn(clippy::ptr_eq)]` on by default
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_eq
warning: 1 warning emitted
This suggestion is wrong. The cast to *const u8
is important, and removing it has led back to the first error:
pub fn eq(a: Rc<dyn Trait>, b: Rc<dyn Trait>) -> bool {
std::ptr::eq(&*a as *const dyn Trait, &*b as *const dyn Trait)
}
error: comparing trait object pointers compares a non-unique vtable address
--> src/lib.rs:4:5
|
4 | std::ptr::eq(&*a as *const dyn Trait, &*b as *const dyn Trait)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[deny(clippy::vtable_address_comparisons)]` on by default
= help: consider extracting and comparing data pointers only
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#vtable_address_comparisons
Meta
cargo clippy -V
: clippy 0.0.212 (0b644e4 2020-12-26)rustc -Vv
:rustc 1.51.0-nightly (0b644e419 2020-12-26) binary: rustc commit-hash: 0b644e419681835bd0f5871c3bfbd648aa04f157 commit-date: 2020-12-26 host: x86_64-unknown-linux-gnu release: 1.51.0-nightly
Metadata
Metadata
Assignees
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thingE-hardCall for participation: This a hard problem and requires more experience or effort to work onCall for participation: This a hard problem and requires more experience or effort to work onI-false-positiveIssue: The lint was triggered on code it shouldn't haveIssue: The lint was triggered on code it shouldn't haveT-middleType: Probably requires verifiying typesType: Probably requires verifiying types