Linux 3.2.64
[linux/fpc-iii.git] / scripts / coccinelle / null / deref_null.cocci
blobcdac6cfcce92cc8ab25304806fbff81991b51dad
1 ///
2 /// A variable is dereference under a NULL test.
3 /// Even though it is know to be NULL.
4 ///
5 // Confidence: Moderate
6 // Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
7 // Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
8 // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
9 // URL: http://coccinelle.lip6.fr/
10 // Comments: -I ... -all_includes can give more complete results
11 // Options:
13 virtual context
14 virtual org
15 virtual report
17 @ifm@
18 expression *E;
19 statement S1,S2;
20 position p1;
23 if@p1 ((E == NULL && ...) || ...) S1 else S2
25 // The following two rules are separate, because both can match a single
26 // expression in different ways
27 @pr1 expression@
28 expression *ifm.E;
29 identifier f;
30 position p1;
33  (E != NULL && ...) ? <+...E->f@p1...+> : ...
35 @pr2 expression@
36 expression *ifm.E;
37 identifier f;
38 position p2;
42   (E != NULL) && ... && <+...E->f@p2...+>
44   (E == NULL) || ... || <+...E->f@p2...+>
46  sizeof(<+...E->f@p2...+>)
49 // For org and report modes
51 @r depends on !context && (org || report) exists@
52 expression subE <= ifm.E;
53 expression *ifm.E;
54 expression E1,E2;
55 identifier f;
56 statement S1,S2,S3,S4;
57 iterator iter;
58 position p!={pr1.p1,pr2.p2};
59 position ifm.p1;
62 if@p1 ((E == NULL && ...) || ...)
64   ... when != if (...) S1 else S2
66  iter(subE,...) S4 // no use
68  list_remove_head(E2,subE,...)
70  subE = E1
72  for(subE = E1;...;...) S4
74  subE++
76  ++subE
78  --subE
80  subE--
82  &subE
84  E->f@p // bad use
86   ... when any
87   return ...;
89 else S3
91 @script:python depends on !context && !org && report@
92 p << r.p;
93 p1 << ifm.p1;
94 x << ifm.E;
97 msg="ERROR: %s is NULL but dereferenced." % (x)
98 coccilib.report.print_report(p[0], msg)
99 cocci.include_match(False)
101 @script:python depends on !context && org && !report@
102 p << r.p;
103 p1 << ifm.p1;
104 x << ifm.E;
107 msg="ERROR: %s is NULL but dereferenced." % (x)
108 msg_safe=msg.replace("[","@(").replace("]",")")
109 cocci.print_main(msg_safe,p)
110 cocci.include_match(False)
112 @s depends on !context && (org || report) exists@
113 expression subE <= ifm.E;
114 expression *ifm.E;
115 expression E1,E2;
116 identifier f;
117 statement S1,S2,S3,S4;
118 iterator iter;
119 position p!={pr1.p1,pr2.p2};
120 position ifm.p1;
123 if@p1 ((E == NULL && ...) || ...)
125   ... when != if (...) S1 else S2
127  iter(subE,...) S4 // no use
129  list_remove_head(E2,subE,...)
131  subE = E1
133  for(subE = E1;...;...) S4
135  subE++
137  ++subE
139  --subE
141  subE--
143  &subE
145  E->f@p // bad use
147   ... when any
149 else S3
151 @script:python depends on !context && !org && report@
152 p << s.p;
153 p1 << ifm.p1;
154 x << ifm.E;
157 msg="ERROR: %s is NULL but dereferenced." % (x)
158 coccilib.report.print_report(p[0], msg)
160 @script:python depends on !context && org && !report@
161 p << s.p;
162 p1 << ifm.p1;
163 x << ifm.E;
166 msg="ERROR: %s is NULL but dereferenced." % (x)
167 msg_safe=msg.replace("[","@(").replace("]",")")
168 cocci.print_main(msg_safe,p)
170 // For context mode
172 @depends on context && !org && !report exists@
173 expression subE <= ifm.E;
174 expression *ifm.E;
175 expression E1,E2;
176 identifier f;
177 statement S1,S2,S3,S4;
178 iterator iter;
179 position p!={pr1.p1,pr2.p2};
180 position ifm.p1;
183 if@p1 ((E == NULL && ...) || ...)
185   ... when != if (...) S1 else S2
187  iter(subE,...) S4 // no use
189  list_remove_head(E2,subE,...)
191  subE = E1
193  for(subE = E1;...;...) S4
195  subE++
197  ++subE
199  --subE
201  subE--
203  &subE
205 * E->f@p // bad use
207   ... when any
208   return ...;
210 else S3
212 // The following three rules are duplicates of ifm, pr1 and pr2 respectively.
213 // It is need because the previous rule as already made a "change".
215 @ifm1@
216 expression *E;
217 statement S1,S2;
218 position p1;
221 if@p1 ((E == NULL && ...) || ...) S1 else S2
223 @pr11 expression@
224 expression *ifm1.E;
225 identifier f;
226 position p1;
229  (E != NULL && ...) ? <+...E->f@p1...+> : ...
231 @pr12 expression@
232 expression *ifm1.E;
233 identifier f;
234 position p2;
238   (E != NULL) && ... && <+...E->f@p2...+>
240   (E == NULL) || ... || <+...E->f@p2...+>
242  sizeof(<+...E->f@p2...+>)
245 @depends on context && !org && !report exists@
246 expression subE <= ifm1.E;
247 expression *ifm1.E;
248 expression E1,E2;
249 identifier f;
250 statement S1,S2,S3,S4;
251 iterator iter;
252 position p!={pr11.p1,pr12.p2};
253 position ifm1.p1;
256 if@p1 ((E == NULL && ...) || ...)
258   ... when != if (...) S1 else S2
260  iter(subE,...) S4 // no use
262  list_remove_head(E2,subE,...)
264  subE = E1
266  for(subE = E1;...;...) S4
268  subE++
270  ++subE
272  --subE
274  subE--
276  &subE
278 * E->f@p // bad use
280   ... when any
282 else S3