xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/null/badzero.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun/// Compare pointer-typed values to NULL rather than 0
3*4882a593Smuzhiyun///
4*4882a593Smuzhiyun//# This makes an effort to choose between !x and x == NULL.  !x is used
5*4882a593Smuzhiyun//# if it has previously been used with the function used to initialize x.
6*4882a593Smuzhiyun//# This relies on type information.  More type information can be obtained
7*4882a593Smuzhiyun//# using the option -all_includes and the option -I to specify an
8*4882a593Smuzhiyun//# include path.
9*4882a593Smuzhiyun//
10*4882a593Smuzhiyun// Confidence: High
11*4882a593Smuzhiyun// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
12*4882a593Smuzhiyun// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
13*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/
14*4882a593Smuzhiyun// Requires: 1.0.0
15*4882a593Smuzhiyun// Options:
16*4882a593Smuzhiyun
17*4882a593Smuzhiyunvirtual patch
18*4882a593Smuzhiyunvirtual context
19*4882a593Smuzhiyunvirtual org
20*4882a593Smuzhiyunvirtual report
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun@initialize:ocaml@
23*4882a593Smuzhiyun@@
24*4882a593Smuzhiyunlet negtable = Hashtbl.create 101
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun@depends on patch@
27*4882a593Smuzhiyunexpression *E;
28*4882a593Smuzhiyunidentifier f;
29*4882a593Smuzhiyun@@
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun(
32*4882a593Smuzhiyun  (E = f(...)) ==
33*4882a593Smuzhiyun- 0
34*4882a593Smuzhiyun+ NULL
35*4882a593Smuzhiyun|
36*4882a593Smuzhiyun  (E = f(...)) !=
37*4882a593Smuzhiyun- 0
38*4882a593Smuzhiyun+ NULL
39*4882a593Smuzhiyun|
40*4882a593Smuzhiyun- 0
41*4882a593Smuzhiyun+ NULL
42*4882a593Smuzhiyun  == (E = f(...))
43*4882a593Smuzhiyun|
44*4882a593Smuzhiyun- 0
45*4882a593Smuzhiyun+ NULL
46*4882a593Smuzhiyun  != (E = f(...))
47*4882a593Smuzhiyun)
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun@t1 depends on !patch@
51*4882a593Smuzhiyunexpression *E;
52*4882a593Smuzhiyunidentifier f;
53*4882a593Smuzhiyunposition p;
54*4882a593Smuzhiyun@@
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun(
57*4882a593Smuzhiyun  (E = f(...)) ==
58*4882a593Smuzhiyun* 0@p
59*4882a593Smuzhiyun|
60*4882a593Smuzhiyun  (E = f(...)) !=
61*4882a593Smuzhiyun* 0@p
62*4882a593Smuzhiyun|
63*4882a593Smuzhiyun* 0@p
64*4882a593Smuzhiyun  == (E = f(...))
65*4882a593Smuzhiyun|
66*4882a593Smuzhiyun* 0@p
67*4882a593Smuzhiyun  != (E = f(...))
68*4882a593Smuzhiyun)
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun@script:python depends on org@
71*4882a593Smuzhiyunp << t1.p;
72*4882a593Smuzhiyun@@
73*4882a593Smuzhiyun
74*4882a593Smuzhiyuncoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun@script:python depends on report@
77*4882a593Smuzhiyunp << t1.p;
78*4882a593Smuzhiyun@@
79*4882a593Smuzhiyun
80*4882a593Smuzhiyuncoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun// Tests of returned values
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun@s@
85*4882a593Smuzhiyunidentifier f;
86*4882a593Smuzhiyunexpression E,E1;
87*4882a593Smuzhiyun@@
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun E = f(...)
90*4882a593Smuzhiyun ... when != E = E1
91*4882a593Smuzhiyun !E
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun@script:ocaml depends on s@
94*4882a593Smuzhiyunf << s.f;
95*4882a593Smuzhiyun@@
96*4882a593Smuzhiyun
97*4882a593Smuzhiyuntry let _ = Hashtbl.find negtable f in ()
98*4882a593Smuzhiyunwith Not_found -> Hashtbl.add negtable f ()
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun@ r disable is_zero,isnt_zero exists @
101*4882a593Smuzhiyunexpression *E;
102*4882a593Smuzhiyunidentifier f;
103*4882a593Smuzhiyun@@
104*4882a593Smuzhiyun
105*4882a593SmuzhiyunE = f(...)
106*4882a593Smuzhiyun...
107*4882a593Smuzhiyun(E == 0
108*4882a593Smuzhiyun|E != 0
109*4882a593Smuzhiyun|0 == E
110*4882a593Smuzhiyun|0 != E
111*4882a593Smuzhiyun)
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun@script:ocaml@
114*4882a593Smuzhiyunf << r.f;
115*4882a593Smuzhiyun@@
116*4882a593Smuzhiyun
117*4882a593Smuzhiyuntry let _ = Hashtbl.find negtable f in ()
118*4882a593Smuzhiyunwith Not_found -> include_match false
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun// This rule may lead to inconsistent path problems, if E is defined in two
121*4882a593Smuzhiyun// places
122*4882a593Smuzhiyun@ depends on patch disable is_zero,isnt_zero @
123*4882a593Smuzhiyunexpression *E;
124*4882a593Smuzhiyunexpression E1;
125*4882a593Smuzhiyunidentifier r.f;
126*4882a593Smuzhiyun@@
127*4882a593Smuzhiyun
128*4882a593SmuzhiyunE = f(...)
129*4882a593Smuzhiyun<...
130*4882a593Smuzhiyun(
131*4882a593Smuzhiyun- E == 0
132*4882a593Smuzhiyun+ !E
133*4882a593Smuzhiyun|
134*4882a593Smuzhiyun- E != 0
135*4882a593Smuzhiyun+ E
136*4882a593Smuzhiyun|
137*4882a593Smuzhiyun- 0 == E
138*4882a593Smuzhiyun+ !E
139*4882a593Smuzhiyun|
140*4882a593Smuzhiyun- 0 != E
141*4882a593Smuzhiyun+ E
142*4882a593Smuzhiyun)
143*4882a593Smuzhiyun...>
144*4882a593Smuzhiyun?E = E1
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun@t2 depends on !patch disable is_zero,isnt_zero @
147*4882a593Smuzhiyunexpression *E;
148*4882a593Smuzhiyunexpression E1;
149*4882a593Smuzhiyunidentifier r.f;
150*4882a593Smuzhiyunposition p1;
151*4882a593Smuzhiyunposition p2;
152*4882a593Smuzhiyun@@
153*4882a593Smuzhiyun
154*4882a593SmuzhiyunE = f(...)
155*4882a593Smuzhiyun<...
156*4882a593Smuzhiyun(
157*4882a593Smuzhiyun* E == 0@p1
158*4882a593Smuzhiyun|
159*4882a593Smuzhiyun* E != 0@p2
160*4882a593Smuzhiyun|
161*4882a593Smuzhiyun* 0@p1 == E
162*4882a593Smuzhiyun|
163*4882a593Smuzhiyun* 0@p1 != E
164*4882a593Smuzhiyun)
165*4882a593Smuzhiyun...>
166*4882a593Smuzhiyun?E = E1
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun@script:python depends on org@
169*4882a593Smuzhiyunp << t2.p1;
170*4882a593Smuzhiyun@@
171*4882a593Smuzhiyun
172*4882a593Smuzhiyuncoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun@script:python depends on org@
175*4882a593Smuzhiyunp << t2.p2;
176*4882a593Smuzhiyun@@
177*4882a593Smuzhiyun
178*4882a593Smuzhiyuncoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun@script:python depends on report@
181*4882a593Smuzhiyunp << t2.p1;
182*4882a593Smuzhiyun@@
183*4882a593Smuzhiyun
184*4882a593Smuzhiyuncoccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun@script:python depends on report@
187*4882a593Smuzhiyunp << t2.p2;
188*4882a593Smuzhiyun@@
189*4882a593Smuzhiyun
190*4882a593Smuzhiyuncoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun@ depends on patch disable is_zero,isnt_zero @
193*4882a593Smuzhiyunexpression *E;
194*4882a593Smuzhiyun@@
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun(
197*4882a593Smuzhiyun  E ==
198*4882a593Smuzhiyun- 0
199*4882a593Smuzhiyun+ NULL
200*4882a593Smuzhiyun|
201*4882a593Smuzhiyun  E !=
202*4882a593Smuzhiyun- 0
203*4882a593Smuzhiyun+ NULL
204*4882a593Smuzhiyun|
205*4882a593Smuzhiyun- 0
206*4882a593Smuzhiyun+ NULL
207*4882a593Smuzhiyun  == E
208*4882a593Smuzhiyun|
209*4882a593Smuzhiyun- 0
210*4882a593Smuzhiyun+ NULL
211*4882a593Smuzhiyun  != E
212*4882a593Smuzhiyun)
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun@ t3 depends on !patch disable is_zero,isnt_zero @
215*4882a593Smuzhiyunexpression *E;
216*4882a593Smuzhiyunposition p;
217*4882a593Smuzhiyun@@
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun(
220*4882a593Smuzhiyun* E == 0@p
221*4882a593Smuzhiyun|
222*4882a593Smuzhiyun* E != 0@p
223*4882a593Smuzhiyun|
224*4882a593Smuzhiyun* 0@p == E
225*4882a593Smuzhiyun|
226*4882a593Smuzhiyun* 0@p != E
227*4882a593Smuzhiyun)
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun@script:python depends on org@
230*4882a593Smuzhiyunp << t3.p;
231*4882a593Smuzhiyun@@
232*4882a593Smuzhiyun
233*4882a593Smuzhiyuncoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun@script:python depends on report@
236*4882a593Smuzhiyunp << t3.p;
237*4882a593Smuzhiyun@@
238*4882a593Smuzhiyun
239*4882a593Smuzhiyuncoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
240