18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/// Compare pointer-typed values to NULL rather than 0
38c2ecf20Sopenharmony_ci///
48c2ecf20Sopenharmony_ci//# This makes an effort to choose between !x and x == NULL.  !x is used
58c2ecf20Sopenharmony_ci//# if it has previously been used with the function used to initialize x.
68c2ecf20Sopenharmony_ci//# This relies on type information.  More type information can be obtained
78c2ecf20Sopenharmony_ci//# using the option -all_includes and the option -I to specify an
88c2ecf20Sopenharmony_ci//# include path.
98c2ecf20Sopenharmony_ci//
108c2ecf20Sopenharmony_ci// Confidence: High
118c2ecf20Sopenharmony_ci// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
128c2ecf20Sopenharmony_ci// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
138c2ecf20Sopenharmony_ci// URL: http://coccinelle.lip6.fr/
148c2ecf20Sopenharmony_ci// Requires: 1.0.0
158c2ecf20Sopenharmony_ci// Options:
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_civirtual patch
188c2ecf20Sopenharmony_civirtual context
198c2ecf20Sopenharmony_civirtual org
208c2ecf20Sopenharmony_civirtual report
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci@initialize:ocaml@
238c2ecf20Sopenharmony_ci@@
248c2ecf20Sopenharmony_cilet negtable = Hashtbl.create 101
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci@depends on patch@
278c2ecf20Sopenharmony_ciexpression *E;
288c2ecf20Sopenharmony_ciidentifier f;
298c2ecf20Sopenharmony_ci@@
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci(
328c2ecf20Sopenharmony_ci  (E = f(...)) ==
338c2ecf20Sopenharmony_ci- 0
348c2ecf20Sopenharmony_ci+ NULL
358c2ecf20Sopenharmony_ci|
368c2ecf20Sopenharmony_ci  (E = f(...)) !=
378c2ecf20Sopenharmony_ci- 0
388c2ecf20Sopenharmony_ci+ NULL
398c2ecf20Sopenharmony_ci|
408c2ecf20Sopenharmony_ci- 0
418c2ecf20Sopenharmony_ci+ NULL
428c2ecf20Sopenharmony_ci  == (E = f(...))
438c2ecf20Sopenharmony_ci|
448c2ecf20Sopenharmony_ci- 0
458c2ecf20Sopenharmony_ci+ NULL
468c2ecf20Sopenharmony_ci  != (E = f(...))
478c2ecf20Sopenharmony_ci)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci@t1 depends on !patch@
518c2ecf20Sopenharmony_ciexpression *E;
528c2ecf20Sopenharmony_ciidentifier f;
538c2ecf20Sopenharmony_ciposition p;
548c2ecf20Sopenharmony_ci@@
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci(
578c2ecf20Sopenharmony_ci  (E = f(...)) ==
588c2ecf20Sopenharmony_ci* 0@p
598c2ecf20Sopenharmony_ci|
608c2ecf20Sopenharmony_ci  (E = f(...)) !=
618c2ecf20Sopenharmony_ci* 0@p
628c2ecf20Sopenharmony_ci|
638c2ecf20Sopenharmony_ci* 0@p
648c2ecf20Sopenharmony_ci  == (E = f(...))
658c2ecf20Sopenharmony_ci|
668c2ecf20Sopenharmony_ci* 0@p
678c2ecf20Sopenharmony_ci  != (E = f(...))
688c2ecf20Sopenharmony_ci)
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci@script:python depends on org@
718c2ecf20Sopenharmony_cip << t1.p;
728c2ecf20Sopenharmony_ci@@
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci@script:python depends on report@
778c2ecf20Sopenharmony_cip << t1.p;
788c2ecf20Sopenharmony_ci@@
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci// Tests of returned values
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci@s@
858c2ecf20Sopenharmony_ciidentifier f;
868c2ecf20Sopenharmony_ciexpression E,E1;
878c2ecf20Sopenharmony_ci@@
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci E = f(...)
908c2ecf20Sopenharmony_ci ... when != E = E1
918c2ecf20Sopenharmony_ci !E
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci@script:ocaml depends on s@
948c2ecf20Sopenharmony_cif << s.f;
958c2ecf20Sopenharmony_ci@@
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_citry let _ = Hashtbl.find negtable f in ()
988c2ecf20Sopenharmony_ciwith Not_found -> Hashtbl.add negtable f ()
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci@ r disable is_zero,isnt_zero exists @
1018c2ecf20Sopenharmony_ciexpression *E;
1028c2ecf20Sopenharmony_ciidentifier f;
1038c2ecf20Sopenharmony_ci@@
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ciE = f(...)
1068c2ecf20Sopenharmony_ci...
1078c2ecf20Sopenharmony_ci(E == 0
1088c2ecf20Sopenharmony_ci|E != 0
1098c2ecf20Sopenharmony_ci|0 == E
1108c2ecf20Sopenharmony_ci|0 != E
1118c2ecf20Sopenharmony_ci)
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci@script:ocaml@
1148c2ecf20Sopenharmony_cif << r.f;
1158c2ecf20Sopenharmony_ci@@
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_citry let _ = Hashtbl.find negtable f in ()
1188c2ecf20Sopenharmony_ciwith Not_found -> include_match false
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci// This rule may lead to inconsistent path problems, if E is defined in two
1218c2ecf20Sopenharmony_ci// places
1228c2ecf20Sopenharmony_ci@ depends on patch disable is_zero,isnt_zero @
1238c2ecf20Sopenharmony_ciexpression *E;
1248c2ecf20Sopenharmony_ciexpression E1;
1258c2ecf20Sopenharmony_ciidentifier r.f;
1268c2ecf20Sopenharmony_ci@@
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ciE = f(...)
1298c2ecf20Sopenharmony_ci<...
1308c2ecf20Sopenharmony_ci(
1318c2ecf20Sopenharmony_ci- E == 0
1328c2ecf20Sopenharmony_ci+ !E
1338c2ecf20Sopenharmony_ci|
1348c2ecf20Sopenharmony_ci- E != 0
1358c2ecf20Sopenharmony_ci+ E
1368c2ecf20Sopenharmony_ci|
1378c2ecf20Sopenharmony_ci- 0 == E
1388c2ecf20Sopenharmony_ci+ !E
1398c2ecf20Sopenharmony_ci|
1408c2ecf20Sopenharmony_ci- 0 != E
1418c2ecf20Sopenharmony_ci+ E
1428c2ecf20Sopenharmony_ci)
1438c2ecf20Sopenharmony_ci...>
1448c2ecf20Sopenharmony_ci?E = E1
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci@t2 depends on !patch disable is_zero,isnt_zero @
1478c2ecf20Sopenharmony_ciexpression *E;
1488c2ecf20Sopenharmony_ciexpression E1;
1498c2ecf20Sopenharmony_ciidentifier r.f;
1508c2ecf20Sopenharmony_ciposition p1;
1518c2ecf20Sopenharmony_ciposition p2;
1528c2ecf20Sopenharmony_ci@@
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ciE = f(...)
1558c2ecf20Sopenharmony_ci<...
1568c2ecf20Sopenharmony_ci(
1578c2ecf20Sopenharmony_ci* E == 0@p1
1588c2ecf20Sopenharmony_ci|
1598c2ecf20Sopenharmony_ci* E != 0@p2
1608c2ecf20Sopenharmony_ci|
1618c2ecf20Sopenharmony_ci* 0@p1 == E
1628c2ecf20Sopenharmony_ci|
1638c2ecf20Sopenharmony_ci* 0@p1 != E
1648c2ecf20Sopenharmony_ci)
1658c2ecf20Sopenharmony_ci...>
1668c2ecf20Sopenharmony_ci?E = E1
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci@script:python depends on org@
1698c2ecf20Sopenharmony_cip << t2.p1;
1708c2ecf20Sopenharmony_ci@@
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci@script:python depends on org@
1758c2ecf20Sopenharmony_cip << t2.p2;
1768c2ecf20Sopenharmony_ci@@
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci@script:python depends on report@
1818c2ecf20Sopenharmony_cip << t2.p1;
1828c2ecf20Sopenharmony_ci@@
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci@script:python depends on report@
1878c2ecf20Sopenharmony_cip << t2.p2;
1888c2ecf20Sopenharmony_ci@@
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci@ depends on patch disable is_zero,isnt_zero @
1938c2ecf20Sopenharmony_ciexpression *E;
1948c2ecf20Sopenharmony_ci@@
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci(
1978c2ecf20Sopenharmony_ci  E ==
1988c2ecf20Sopenharmony_ci- 0
1998c2ecf20Sopenharmony_ci+ NULL
2008c2ecf20Sopenharmony_ci|
2018c2ecf20Sopenharmony_ci  E !=
2028c2ecf20Sopenharmony_ci- 0
2038c2ecf20Sopenharmony_ci+ NULL
2048c2ecf20Sopenharmony_ci|
2058c2ecf20Sopenharmony_ci- 0
2068c2ecf20Sopenharmony_ci+ NULL
2078c2ecf20Sopenharmony_ci  == E
2088c2ecf20Sopenharmony_ci|
2098c2ecf20Sopenharmony_ci- 0
2108c2ecf20Sopenharmony_ci+ NULL
2118c2ecf20Sopenharmony_ci  != E
2128c2ecf20Sopenharmony_ci)
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci@ t3 depends on !patch disable is_zero,isnt_zero @
2158c2ecf20Sopenharmony_ciexpression *E;
2168c2ecf20Sopenharmony_ciposition p;
2178c2ecf20Sopenharmony_ci@@
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci(
2208c2ecf20Sopenharmony_ci* E == 0@p
2218c2ecf20Sopenharmony_ci|
2228c2ecf20Sopenharmony_ci* E != 0@p
2238c2ecf20Sopenharmony_ci|
2248c2ecf20Sopenharmony_ci* 0@p == E
2258c2ecf20Sopenharmony_ci|
2268c2ecf20Sopenharmony_ci* 0@p != E
2278c2ecf20Sopenharmony_ci)
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci@script:python depends on org@
2308c2ecf20Sopenharmony_cip << t3.p;
2318c2ecf20Sopenharmony_ci@@
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci@script:python depends on report@
2368c2ecf20Sopenharmony_cip << t3.p;
2378c2ecf20Sopenharmony_ci@@
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
240