1- use clippy_utils:: diagnostics:: { span_lint, span_lint_and_help } ;
1+ use clippy_utils:: diagnostics:: span_lint;
22use if_chain:: if_chain;
33use rustc_hir:: { BinOpKind , Expr , ExprKind } ;
44use rustc_lint:: { LateContext , LateLintPass } ;
55use rustc_middle:: ty;
66use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
7- use rustc_span:: sym;
87
98declare_clippy_lint ! {
109 /// ### What it does
@@ -30,31 +29,7 @@ declare_clippy_lint! {
3029 "comparison with an address of a function item"
3130}
3231
33- declare_clippy_lint ! {
34- /// ### What it does
35- /// Checks for comparisons with an address of a trait vtable.
36- ///
37- /// ### Why is this bad?
38- /// Comparing trait objects pointers compares an vtable addresses which
39- /// are not guaranteed to be unique and could vary between different code generation units.
40- /// Furthermore vtables for different types could have the same address after being merged
41- /// together.
42- ///
43- /// ### Example
44- /// ```rust,ignore
45- /// let a: Rc<dyn Trait> = ...
46- /// let b: Rc<dyn Trait> = ...
47- /// if Rc::ptr_eq(&a, &b) {
48- /// ...
49- /// }
50- /// ```
51- #[ clippy:: version = "1.44.0" ]
52- pub VTABLE_ADDRESS_COMPARISONS ,
53- correctness,
54- "comparison with an address of a trait vtable"
55- }
56-
57- declare_lint_pass ! ( UnnamedAddress => [ FN_ADDRESS_COMPARISONS , VTABLE_ADDRESS_COMPARISONS ] ) ;
32+ declare_lint_pass ! ( UnnamedAddress => [ FN_ADDRESS_COMPARISONS ] ) ;
5833
5934impl LateLintPass < ' _ > for UnnamedAddress {
6035 fn check_expr ( & mut self , cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) {
@@ -65,52 +40,10 @@ impl LateLintPass<'_> for UnnamedAddress {
6540 )
6641 }
6742
68- fn is_trait_ptr ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
69- match cx. typeck_results ( ) . expr_ty_adjusted ( expr) . kind ( ) {
70- ty:: RawPtr ( ty:: TypeAndMut { ty, .. } ) => ty. is_trait ( ) ,
71- _ => false ,
72- }
73- }
74-
7543 fn is_fn_def ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
7644 matches ! ( cx. typeck_results( ) . expr_ty( expr) . kind( ) , ty:: FnDef ( ..) )
7745 }
7846
79- if_chain ! {
80- if let ExprKind :: Binary ( binop, left, right) = expr. kind;
81- if is_comparison( binop. node) ;
82- if is_trait_ptr( cx, left) && is_trait_ptr( cx, right) ;
83- then {
84- span_lint_and_help(
85- cx,
86- VTABLE_ADDRESS_COMPARISONS ,
87- expr. span,
88- "comparing trait object pointers compares a non-unique vtable address" ,
89- None ,
90- "consider extracting and comparing data pointers only" ,
91- ) ;
92- }
93- }
94-
95- if_chain ! {
96- if let ExprKind :: Call ( func, [ ref _left, ref _right] ) = expr. kind;
97- if let ExprKind :: Path ( ref func_qpath) = func. kind;
98- if let Some ( def_id) = cx. qpath_res( func_qpath, func. hir_id) . opt_def_id( ) ;
99- if cx. tcx. is_diagnostic_item( sym:: ptr_eq, def_id) ;
100- let ty_param = cx. typeck_results( ) . node_args( func. hir_id) . type_at( 0 ) ;
101- if ty_param. is_trait( ) ;
102- then {
103- span_lint_and_help(
104- cx,
105- VTABLE_ADDRESS_COMPARISONS ,
106- expr. span,
107- "comparing trait object pointers compares a non-unique vtable address" ,
108- None ,
109- "consider extracting and comparing data pointers only" ,
110- ) ;
111- }
112- }
113-
11447 if_chain ! {
11548 if let ExprKind :: Binary ( binop, left, right) = expr. kind;
11649 if is_comparison( binop. node) ;
0 commit comments