Open
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