1
- use clippy_utils:: diagnostics:: { span_lint, span_lint_and_help } ;
1
+ use clippy_utils:: diagnostics:: span_lint;
2
2
use if_chain:: if_chain;
3
3
use rustc_hir:: { BinOpKind , Expr , ExprKind } ;
4
4
use rustc_lint:: { LateContext , LateLintPass } ;
5
5
use rustc_middle:: ty;
6
6
use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
7
- use rustc_span:: sym;
8
7
9
8
declare_clippy_lint ! {
10
9
/// ### What it does
@@ -30,31 +29,7 @@ declare_clippy_lint! {
30
29
"comparison with an address of a function item"
31
30
}
32
31
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 ] ) ;
58
33
59
34
impl LateLintPass < ' _ > for UnnamedAddress {
60
35
fn check_expr ( & mut self , cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) {
@@ -65,52 +40,10 @@ impl LateLintPass<'_> for UnnamedAddress {
65
40
)
66
41
}
67
42
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
-
75
43
fn is_fn_def ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
76
44
matches ! ( cx. typeck_results( ) . expr_ty( expr) . kind( ) , ty:: FnDef ( ..) )
77
45
}
78
46
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
-
114
47
if_chain ! {
115
48
if let ExprKind :: Binary ( binop, left, right) = expr. kind;
116
49
if is_comparison( binop. node) ;
0 commit comments