Merge tag 'block-5.11-2021-01-10' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / scripts / coccinelle / null / badzero.cocci
blob882dd65313ab51bf381af9bc98ce86b5ba221e5f
1 // SPDX-License-Identifier: GPL-2.0-only
2 /// Compare pointer-typed values to NULL rather than 0
3 ///
4 //# This makes an effort to choose between !x and x == NULL.  !x is used
5 //# if it has previously been used with the function used to initialize x.
6 //# This relies on type information.  More type information can be obtained
7 //# using the option -all_includes and the option -I to specify an
8 //# include path.
9 //
10 // Confidence: High
11 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
12 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
13 // URL: http://coccinelle.lip6.fr/
14 // Requires: 1.0.0
15 // Options:
17 virtual patch
18 virtual context
19 virtual org
20 virtual report
22 @initialize:ocaml@
24 let negtable = Hashtbl.create 101
26 @depends on patch@
27 expression *E;
28 identifier f;
32   (E = f(...)) ==
33 - 0
34 + NULL
36   (E = f(...)) !=
37 - 0
38 + NULL
40 - 0
41 + NULL
42   == (E = f(...))
44 - 0
45 + NULL
46   != (E = f(...))
50 @t1 depends on !patch@
51 expression *E;
52 identifier f;
53 position p;
57   (E = f(...)) ==
58 * 0@p
60   (E = f(...)) !=
61 * 0@p
63 * 0@p
64   == (E = f(...))
66 * 0@p
67   != (E = f(...))
70 @script:python depends on org@
71 p << t1.p;
74 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
76 @script:python depends on report@
77 p << t1.p;
80 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
82 // Tests of returned values
84 @s@
85 identifier f;
86 expression E,E1;
89  E = f(...)
90  ... when != E = E1
91  !E
93 @script:ocaml depends on s@
94 f << s.f;
97 try let _ = Hashtbl.find negtable f in ()
98 with Not_found -> Hashtbl.add negtable f ()
100 @ r disable is_zero,isnt_zero exists @
101 expression *E;
102 identifier f;
105 E = f(...)
107 (E == 0
108 |E != 0
109 |0 == E
110 |0 != E
113 @script:ocaml@
114 f << r.f;
117 try let _ = Hashtbl.find negtable f in ()
118 with Not_found -> include_match false
120 // This rule may lead to inconsistent path problems, if E is defined in two
121 // places
122 @ depends on patch disable is_zero,isnt_zero @
123 expression *E;
124 expression E1;
125 identifier r.f;
128 E = f(...)
129 <...
131 - E == 0
132 + !E
134 - E != 0
135 + E
137 - 0 == E
138 + !E
140 - 0 != E
141 + E
143 ...>
144 ?E = E1
146 @t2 depends on !patch disable is_zero,isnt_zero @
147 expression *E;
148 expression E1;
149 identifier r.f;
150 position p1;
151 position p2;
154 E = f(...)
155 <...
157 * E == 0@p1
159 * E != 0@p2
161 * 0@p1 == E
163 * 0@p1 != E
165 ...>
166 ?E = E1
168 @script:python depends on org@
169 p << t2.p1;
172 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
174 @script:python depends on org@
175 p << t2.p2;
178 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
180 @script:python depends on report@
181 p << t2.p1;
184 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
186 @script:python depends on report@
187 p << t2.p2;
190 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
192 @ depends on patch disable is_zero,isnt_zero @
193 expression *E;
197   E ==
198 - 0
199 + NULL
201   E !=
202 - 0
203 + NULL
205 - 0
206 + NULL
207   == E
209 - 0
210 + NULL
211   != E
214 @ t3 depends on !patch disable is_zero,isnt_zero @
215 expression *E;
216 position p;
220 * E == 0@p
222 * E != 0@p
224 * 0@p == E
226 * 0@p != E
229 @script:python depends on org@
230 p << t3.p;
233 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
235 @script:python depends on report@
236 p << t3.p;
239 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")