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