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