libceph: encapsulate out message data setup
[linux/fpc-iii.git] / scripts / coccinelle / null / badzero.cocci
blobd79baf7220e778a430c8485bfc8f18b6d9587d19
1 /// Compare pointer-typed values to NULL rather than 0
2 ///
3 //# This makes an effort to choose between !x and x == NULL.  !x is used
4 //# if it has previously been used with the function used to initialize x.
5 //# This relies on type information.  More type information can be obtained
6 //# using the option -all_includes and the option -I to specify an
7 //# include path.
8 //
9 // Confidence: High
10 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
11 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
12 // URL: http://coccinelle.lip6.fr/
13 // Comments:
14 // Options:
16 virtual patch
17 virtual context
18 virtual org
19 virtual report
21 @initialize:ocaml@
22 let negtable = Hashtbl.create 101
24 @depends on patch@
25 expression *E;
26 identifier f;
30   (E = f(...)) ==
31 - 0
32 + NULL
34   (E = f(...)) !=
35 - 0
36 + NULL
38 - 0
39 + NULL
40   == (E = f(...))
42 - 0
43 + NULL
44   != (E = f(...))
48 @t1 depends on !patch@
49 expression *E;
50 identifier f;
51 position p;
55   (E = f(...)) ==
56 * 0@p
58   (E = f(...)) !=
59 * 0@p
61 * 0@p
62   == (E = f(...))
64 * 0@p
65   != (E = f(...))
68 @script:python depends on org@
69 p << t1.p;
72 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
74 @script:python depends on report@
75 p << t1.p;
78 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
80 // Tests of returned values
82 @s@
83 identifier f;
84 expression E,E1;
87  E = f(...)
88  ... when != E = E1
89  !E
91 @script:ocaml depends on s@
92 f << s.f;
95 try let _ = Hashtbl.find negtable f in ()
96 with Not_found -> Hashtbl.add negtable f ()
98 @ r disable is_zero,isnt_zero exists @
99 expression *E;
100 identifier f;
103 E = f(...)
105 (E == 0
106 |E != 0
107 |0 == E
108 |0 != E
111 @script:ocaml@
112 f << r.f;
115 try let _ = Hashtbl.find negtable f in ()
116 with Not_found -> include_match false
118 // This rule may lead to inconsistent path problems, if E is defined in two
119 // places
120 @ depends on patch disable is_zero,isnt_zero @
121 expression *E;
122 expression E1;
123 identifier r.f;
126 E = f(...)
127 <...
129 - E == 0
130 + !E
132 - E != 0
133 + E
135 - 0 == E
136 + !E
138 - 0 != E
139 + E
141 ...>
142 ?E = E1
144 @t2 depends on !patch disable is_zero,isnt_zero @
145 expression *E;
146 expression E1;
147 identifier r.f;
148 position p1;
149 position p2;
152 E = f(...)
153 <...
155 * E == 0@p1
157 * E != 0@p2
159 * 0@p1 == E
161 * 0@p1 != E
163 ...>
164 ?E = E1
166 @script:python depends on org@
167 p << t2.p1;
170 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
172 @script:python depends on org@
173 p << t2.p2;
176 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
178 @script:python depends on report@
179 p << t2.p1;
182 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
184 @script:python depends on report@
185 p << t2.p2;
188 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
190 @ depends on patch disable is_zero,isnt_zero @
191 expression *E;
195   E ==
196 - 0
197 + NULL
199   E !=
200 - 0
201 + NULL
203 - 0
204 + NULL
205   == E
207 - 0
208 + NULL
209   != E
212 @ t3 depends on !patch disable is_zero,isnt_zero @
213 expression *E;
214 position p;
218 * E == 0@p
220 * E != 0@p
222 * 0@p == E
224 * 0@p != E
227 @script:python depends on org@
228 p << t3.p;
231 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
233 @script:python depends on report@
234 p << t3.p;
237 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")