xref: /openbmc/linux/scripts/coccinelle/null/badzero.cocci (revision e0be348e4d6ebd660c9558bcee50f648491cfef6)
147f67ea9SJulia Lawall/// Compare pointer-typed values to NULL rather than 0
247f67ea9SJulia Lawall///
347f67ea9SJulia Lawall//# This makes an effort to choose between !x and x == NULL.  !x is used
447f67ea9SJulia Lawall//# if it has previously been used with the function used to initialize x.
547f67ea9SJulia Lawall//# This relies on type information.  More type information can be obtained
647f67ea9SJulia Lawall//# using the option -all_includes and the option -I to specify an
747f67ea9SJulia Lawall//# include path.
847f67ea9SJulia Lawall//
947f67ea9SJulia Lawall// Confidence: High
1047f67ea9SJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
1147f67ea9SJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
1247f67ea9SJulia Lawall// URL: http://coccinelle.lip6.fr/
13*e0be348eSMasahiro Yamada// Requires: 1.0.0
1447f67ea9SJulia Lawall// Options:
1547f67ea9SJulia Lawall
1647f67ea9SJulia Lawallvirtual patch
1747f67ea9SJulia Lawallvirtual context
1847f67ea9SJulia Lawallvirtual org
1947f67ea9SJulia Lawallvirtual report
2047f67ea9SJulia Lawall
2147f67ea9SJulia Lawall@initialize:ocaml@
22b5889ab7SHimangi Saraogi@@
2347f67ea9SJulia Lawalllet negtable = Hashtbl.create 101
2447f67ea9SJulia Lawall
2547f67ea9SJulia Lawall@depends on patch@
2647f67ea9SJulia Lawallexpression *E;
2747f67ea9SJulia Lawallidentifier f;
2847f67ea9SJulia Lawall@@
2947f67ea9SJulia Lawall
3047f67ea9SJulia Lawall(
3147f67ea9SJulia Lawall  (E = f(...)) ==
3247f67ea9SJulia Lawall- 0
3347f67ea9SJulia Lawall+ NULL
3447f67ea9SJulia Lawall|
3547f67ea9SJulia Lawall  (E = f(...)) !=
3647f67ea9SJulia Lawall- 0
3747f67ea9SJulia Lawall+ NULL
3847f67ea9SJulia Lawall|
3947f67ea9SJulia Lawall- 0
4047f67ea9SJulia Lawall+ NULL
4147f67ea9SJulia Lawall  == (E = f(...))
4247f67ea9SJulia Lawall|
4347f67ea9SJulia Lawall- 0
4447f67ea9SJulia Lawall+ NULL
4547f67ea9SJulia Lawall  != (E = f(...))
4647f67ea9SJulia Lawall)
4747f67ea9SJulia Lawall
4847f67ea9SJulia Lawall
4947f67ea9SJulia Lawall@t1 depends on !patch@
5047f67ea9SJulia Lawallexpression *E;
5147f67ea9SJulia Lawallidentifier f;
5247f67ea9SJulia Lawallposition p;
5347f67ea9SJulia Lawall@@
5447f67ea9SJulia Lawall
5547f67ea9SJulia Lawall(
5647f67ea9SJulia Lawall  (E = f(...)) ==
5747f67ea9SJulia Lawall* 0@p
5847f67ea9SJulia Lawall|
5947f67ea9SJulia Lawall  (E = f(...)) !=
6047f67ea9SJulia Lawall* 0@p
6147f67ea9SJulia Lawall|
6247f67ea9SJulia Lawall* 0@p
6347f67ea9SJulia Lawall  == (E = f(...))
6447f67ea9SJulia Lawall|
6547f67ea9SJulia Lawall* 0@p
6647f67ea9SJulia Lawall  != (E = f(...))
6747f67ea9SJulia Lawall)
6847f67ea9SJulia Lawall
6947f67ea9SJulia Lawall@script:python depends on org@
7047f67ea9SJulia Lawallp << t1.p;
7147f67ea9SJulia Lawall@@
7247f67ea9SJulia Lawall
7347f67ea9SJulia Lawallcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
7447f67ea9SJulia Lawall
7547f67ea9SJulia Lawall@script:python depends on report@
7647f67ea9SJulia Lawallp << t1.p;
7747f67ea9SJulia Lawall@@
7847f67ea9SJulia Lawall
7947f67ea9SJulia Lawallcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
8047f67ea9SJulia Lawall
8147f67ea9SJulia Lawall// Tests of returned values
8247f67ea9SJulia Lawall
8347f67ea9SJulia Lawall@s@
8447f67ea9SJulia Lawallidentifier f;
8547f67ea9SJulia Lawallexpression E,E1;
8647f67ea9SJulia Lawall@@
8747f67ea9SJulia Lawall
8847f67ea9SJulia Lawall E = f(...)
8947f67ea9SJulia Lawall ... when != E = E1
9047f67ea9SJulia Lawall !E
9147f67ea9SJulia Lawall
9247f67ea9SJulia Lawall@script:ocaml depends on s@
9347f67ea9SJulia Lawallf << s.f;
9447f67ea9SJulia Lawall@@
9547f67ea9SJulia Lawall
9647f67ea9SJulia Lawalltry let _ = Hashtbl.find negtable f in ()
9747f67ea9SJulia Lawallwith Not_found -> Hashtbl.add negtable f ()
9847f67ea9SJulia Lawall
9947f67ea9SJulia Lawall@ r disable is_zero,isnt_zero exists @
10047f67ea9SJulia Lawallexpression *E;
10147f67ea9SJulia Lawallidentifier f;
10247f67ea9SJulia Lawall@@
10347f67ea9SJulia Lawall
10447f67ea9SJulia LawallE = f(...)
10547f67ea9SJulia Lawall...
10647f67ea9SJulia Lawall(E == 0
10747f67ea9SJulia Lawall|E != 0
10847f67ea9SJulia Lawall|0 == E
10947f67ea9SJulia Lawall|0 != E
11047f67ea9SJulia Lawall)
11147f67ea9SJulia Lawall
11247f67ea9SJulia Lawall@script:ocaml@
11347f67ea9SJulia Lawallf << r.f;
11447f67ea9SJulia Lawall@@
11547f67ea9SJulia Lawall
11647f67ea9SJulia Lawalltry let _ = Hashtbl.find negtable f in ()
11747f67ea9SJulia Lawallwith Not_found -> include_match false
11847f67ea9SJulia Lawall
11947f67ea9SJulia Lawall// This rule may lead to inconsistent path problems, if E is defined in two
12047f67ea9SJulia Lawall// places
12147f67ea9SJulia Lawall@ depends on patch disable is_zero,isnt_zero @
12247f67ea9SJulia Lawallexpression *E;
12347f67ea9SJulia Lawallexpression E1;
12447f67ea9SJulia Lawallidentifier r.f;
12547f67ea9SJulia Lawall@@
12647f67ea9SJulia Lawall
12747f67ea9SJulia LawallE = f(...)
12847f67ea9SJulia Lawall<...
12947f67ea9SJulia Lawall(
13047f67ea9SJulia Lawall- E == 0
13147f67ea9SJulia Lawall+ !E
13247f67ea9SJulia Lawall|
13347f67ea9SJulia Lawall- E != 0
13447f67ea9SJulia Lawall+ E
13547f67ea9SJulia Lawall|
13647f67ea9SJulia Lawall- 0 == E
13747f67ea9SJulia Lawall+ !E
13847f67ea9SJulia Lawall|
13947f67ea9SJulia Lawall- 0 != E
14047f67ea9SJulia Lawall+ E
14147f67ea9SJulia Lawall)
14247f67ea9SJulia Lawall...>
14347f67ea9SJulia Lawall?E = E1
14447f67ea9SJulia Lawall
14547f67ea9SJulia Lawall@t2 depends on !patch disable is_zero,isnt_zero @
14647f67ea9SJulia Lawallexpression *E;
14747f67ea9SJulia Lawallexpression E1;
14847f67ea9SJulia Lawallidentifier r.f;
14947f67ea9SJulia Lawallposition p1;
15047f67ea9SJulia Lawallposition p2;
15147f67ea9SJulia Lawall@@
15247f67ea9SJulia Lawall
15347f67ea9SJulia LawallE = f(...)
15447f67ea9SJulia Lawall<...
15547f67ea9SJulia Lawall(
15647f67ea9SJulia Lawall* E == 0@p1
15747f67ea9SJulia Lawall|
15847f67ea9SJulia Lawall* E != 0@p2
15947f67ea9SJulia Lawall|
16047f67ea9SJulia Lawall* 0@p1 == E
16147f67ea9SJulia Lawall|
16247f67ea9SJulia Lawall* 0@p1 != E
16347f67ea9SJulia Lawall)
16447f67ea9SJulia Lawall...>
16547f67ea9SJulia Lawall?E = E1
16647f67ea9SJulia Lawall
16747f67ea9SJulia Lawall@script:python depends on org@
16847f67ea9SJulia Lawallp << t2.p1;
16947f67ea9SJulia Lawall@@
17047f67ea9SJulia Lawall
17147f67ea9SJulia Lawallcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
17247f67ea9SJulia Lawall
17347f67ea9SJulia Lawall@script:python depends on org@
17447f67ea9SJulia Lawallp << t2.p2;
17547f67ea9SJulia Lawall@@
17647f67ea9SJulia Lawall
17747f67ea9SJulia Lawallcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
17847f67ea9SJulia Lawall
17947f67ea9SJulia Lawall@script:python depends on report@
18047f67ea9SJulia Lawallp << t2.p1;
18147f67ea9SJulia Lawall@@
18247f67ea9SJulia Lawall
18347f67ea9SJulia Lawallcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
18447f67ea9SJulia Lawall
18547f67ea9SJulia Lawall@script:python depends on report@
18647f67ea9SJulia Lawallp << t2.p2;
18747f67ea9SJulia Lawall@@
18847f67ea9SJulia Lawall
18947f67ea9SJulia Lawallcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
19047f67ea9SJulia Lawall
19147f67ea9SJulia Lawall@ depends on patch disable is_zero,isnt_zero @
19247f67ea9SJulia Lawallexpression *E;
19347f67ea9SJulia Lawall@@
19447f67ea9SJulia Lawall
19547f67ea9SJulia Lawall(
19647f67ea9SJulia Lawall  E ==
19747f67ea9SJulia Lawall- 0
19847f67ea9SJulia Lawall+ NULL
19947f67ea9SJulia Lawall|
20047f67ea9SJulia Lawall  E !=
20147f67ea9SJulia Lawall- 0
20247f67ea9SJulia Lawall+ NULL
20347f67ea9SJulia Lawall|
20447f67ea9SJulia Lawall- 0
20547f67ea9SJulia Lawall+ NULL
20647f67ea9SJulia Lawall  == E
20747f67ea9SJulia Lawall|
20847f67ea9SJulia Lawall- 0
20947f67ea9SJulia Lawall+ NULL
21047f67ea9SJulia Lawall  != E
21147f67ea9SJulia Lawall)
21247f67ea9SJulia Lawall
21347f67ea9SJulia Lawall@ t3 depends on !patch disable is_zero,isnt_zero @
21447f67ea9SJulia Lawallexpression *E;
21547f67ea9SJulia Lawallposition p;
21647f67ea9SJulia Lawall@@
21747f67ea9SJulia Lawall
21847f67ea9SJulia Lawall(
21947f67ea9SJulia Lawall* E == 0@p
22047f67ea9SJulia Lawall|
22147f67ea9SJulia Lawall* E != 0@p
22247f67ea9SJulia Lawall|
22347f67ea9SJulia Lawall* 0@p == E
22447f67ea9SJulia Lawall|
22547f67ea9SJulia Lawall* 0@p != E
22647f67ea9SJulia Lawall)
22747f67ea9SJulia Lawall
22847f67ea9SJulia Lawall@script:python depends on org@
22947f67ea9SJulia Lawallp << t3.p;
23047f67ea9SJulia Lawall@@
23147f67ea9SJulia Lawall
23247f67ea9SJulia Lawallcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
23347f67ea9SJulia Lawall
23447f67ea9SJulia Lawall@script:python depends on report@
23547f67ea9SJulia Lawallp << t3.p;
23647f67ea9SJulia Lawall@@
23747f67ea9SJulia Lawall
23847f67ea9SJulia Lawallcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
239