Skip to content

Incorrect suggestion for ptr_eq warning leads to vtable_address_comparisons error #6524

Open
@andersk

Description

@andersk

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

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingE-hardCall 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 haveT-middleType: Probably requires verifiying types

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions