1*4320e2fdSHeinrich Schuchardt/// Compare pointer-typed values to NULL rather than 0 2*4320e2fdSHeinrich Schuchardt/// 3*4320e2fdSHeinrich Schuchardt//# This makes an effort to choose between !x and x == NULL. !x is used 4*4320e2fdSHeinrich Schuchardt//# if it has previously been used with the function used to initialize x. 5*4320e2fdSHeinrich Schuchardt//# This relies on type information. More type information can be obtained 6*4320e2fdSHeinrich Schuchardt//# using the option -all_includes and the option -I to specify an 7*4320e2fdSHeinrich Schuchardt//# include path. 8*4320e2fdSHeinrich Schuchardt// 9*4320e2fdSHeinrich Schuchardt// Confidence: High 10*4320e2fdSHeinrich Schuchardt// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 11*4320e2fdSHeinrich Schuchardt// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 12*4320e2fdSHeinrich Schuchardt// URL: http://coccinelle.lip6.fr/ 13*4320e2fdSHeinrich Schuchardt// Requires: 1.0.0 14*4320e2fdSHeinrich Schuchardt// Options: 15*4320e2fdSHeinrich Schuchardt// 16*4320e2fdSHeinrich Schuchardt// SPDX-License-Identifier: GPL-2.0 17*4320e2fdSHeinrich Schuchardt// 18*4320e2fdSHeinrich Schuchardt 19*4320e2fdSHeinrich Schuchardtvirtual patch 20*4320e2fdSHeinrich Schuchardtvirtual context 21*4320e2fdSHeinrich Schuchardtvirtual org 22*4320e2fdSHeinrich Schuchardtvirtual report 23*4320e2fdSHeinrich Schuchardt 24*4320e2fdSHeinrich Schuchardt@initialize:ocaml@ 25*4320e2fdSHeinrich Schuchardt@@ 26*4320e2fdSHeinrich Schuchardtlet negtable = Hashtbl.create 101 27*4320e2fdSHeinrich Schuchardt 28*4320e2fdSHeinrich Schuchardt@depends on patch@ 29*4320e2fdSHeinrich Schuchardtexpression *E; 30*4320e2fdSHeinrich Schuchardtidentifier f; 31*4320e2fdSHeinrich Schuchardt@@ 32*4320e2fdSHeinrich Schuchardt 33*4320e2fdSHeinrich Schuchardt( 34*4320e2fdSHeinrich Schuchardt (E = f(...)) == 35*4320e2fdSHeinrich Schuchardt- 0 36*4320e2fdSHeinrich Schuchardt+ NULL 37*4320e2fdSHeinrich Schuchardt| 38*4320e2fdSHeinrich Schuchardt (E = f(...)) != 39*4320e2fdSHeinrich Schuchardt- 0 40*4320e2fdSHeinrich Schuchardt+ NULL 41*4320e2fdSHeinrich Schuchardt| 42*4320e2fdSHeinrich Schuchardt- 0 43*4320e2fdSHeinrich Schuchardt+ NULL 44*4320e2fdSHeinrich Schuchardt == (E = f(...)) 45*4320e2fdSHeinrich Schuchardt| 46*4320e2fdSHeinrich Schuchardt- 0 47*4320e2fdSHeinrich Schuchardt+ NULL 48*4320e2fdSHeinrich Schuchardt != (E = f(...)) 49*4320e2fdSHeinrich Schuchardt) 50*4320e2fdSHeinrich Schuchardt 51*4320e2fdSHeinrich Schuchardt 52*4320e2fdSHeinrich Schuchardt@t1 depends on !patch@ 53*4320e2fdSHeinrich Schuchardtexpression *E; 54*4320e2fdSHeinrich Schuchardtidentifier f; 55*4320e2fdSHeinrich Schuchardtposition p; 56*4320e2fdSHeinrich Schuchardt@@ 57*4320e2fdSHeinrich Schuchardt 58*4320e2fdSHeinrich Schuchardt( 59*4320e2fdSHeinrich Schuchardt (E = f(...)) == 60*4320e2fdSHeinrich Schuchardt* 0@p 61*4320e2fdSHeinrich Schuchardt| 62*4320e2fdSHeinrich Schuchardt (E = f(...)) != 63*4320e2fdSHeinrich Schuchardt* 0@p 64*4320e2fdSHeinrich Schuchardt| 65*4320e2fdSHeinrich Schuchardt* 0@p 66*4320e2fdSHeinrich Schuchardt == (E = f(...)) 67*4320e2fdSHeinrich Schuchardt| 68*4320e2fdSHeinrich Schuchardt* 0@p 69*4320e2fdSHeinrich Schuchardt != (E = f(...)) 70*4320e2fdSHeinrich Schuchardt) 71*4320e2fdSHeinrich Schuchardt 72*4320e2fdSHeinrich Schuchardt@script:python depends on org@ 73*4320e2fdSHeinrich Schuchardtp << t1.p; 74*4320e2fdSHeinrich Schuchardt@@ 75*4320e2fdSHeinrich Schuchardt 76*4320e2fdSHeinrich Schuchardtcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 77*4320e2fdSHeinrich Schuchardt 78*4320e2fdSHeinrich Schuchardt@script:python depends on report@ 79*4320e2fdSHeinrich Schuchardtp << t1.p; 80*4320e2fdSHeinrich Schuchardt@@ 81*4320e2fdSHeinrich Schuchardt 82*4320e2fdSHeinrich Schuchardtcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0") 83*4320e2fdSHeinrich Schuchardt 84*4320e2fdSHeinrich Schuchardt// Tests of returned values 85*4320e2fdSHeinrich Schuchardt 86*4320e2fdSHeinrich Schuchardt@s@ 87*4320e2fdSHeinrich Schuchardtidentifier f; 88*4320e2fdSHeinrich Schuchardtexpression E,E1; 89*4320e2fdSHeinrich Schuchardt@@ 90*4320e2fdSHeinrich Schuchardt 91*4320e2fdSHeinrich Schuchardt E = f(...) 92*4320e2fdSHeinrich Schuchardt ... when != E = E1 93*4320e2fdSHeinrich Schuchardt !E 94*4320e2fdSHeinrich Schuchardt 95*4320e2fdSHeinrich Schuchardt@script:ocaml depends on s@ 96*4320e2fdSHeinrich Schuchardtf << s.f; 97*4320e2fdSHeinrich Schuchardt@@ 98*4320e2fdSHeinrich Schuchardt 99*4320e2fdSHeinrich Schuchardttry let _ = Hashtbl.find negtable f in () 100*4320e2fdSHeinrich Schuchardtwith Not_found -> Hashtbl.add negtable f () 101*4320e2fdSHeinrich Schuchardt 102*4320e2fdSHeinrich Schuchardt@ r disable is_zero,isnt_zero exists @ 103*4320e2fdSHeinrich Schuchardtexpression *E; 104*4320e2fdSHeinrich Schuchardtidentifier f; 105*4320e2fdSHeinrich Schuchardt@@ 106*4320e2fdSHeinrich Schuchardt 107*4320e2fdSHeinrich SchuchardtE = f(...) 108*4320e2fdSHeinrich Schuchardt... 109*4320e2fdSHeinrich Schuchardt(E == 0 110*4320e2fdSHeinrich Schuchardt|E != 0 111*4320e2fdSHeinrich Schuchardt|0 == E 112*4320e2fdSHeinrich Schuchardt|0 != E 113*4320e2fdSHeinrich Schuchardt) 114*4320e2fdSHeinrich Schuchardt 115*4320e2fdSHeinrich Schuchardt@script:ocaml@ 116*4320e2fdSHeinrich Schuchardtf << r.f; 117*4320e2fdSHeinrich Schuchardt@@ 118*4320e2fdSHeinrich Schuchardt 119*4320e2fdSHeinrich Schuchardttry let _ = Hashtbl.find negtable f in () 120*4320e2fdSHeinrich Schuchardtwith Not_found -> include_match false 121*4320e2fdSHeinrich Schuchardt 122*4320e2fdSHeinrich Schuchardt// This rule may lead to inconsistent path problems, if E is defined in two 123*4320e2fdSHeinrich Schuchardt// places 124*4320e2fdSHeinrich Schuchardt@ depends on patch disable is_zero,isnt_zero @ 125*4320e2fdSHeinrich Schuchardtexpression *E; 126*4320e2fdSHeinrich Schuchardtexpression E1; 127*4320e2fdSHeinrich Schuchardtidentifier r.f; 128*4320e2fdSHeinrich Schuchardt@@ 129*4320e2fdSHeinrich Schuchardt 130*4320e2fdSHeinrich SchuchardtE = f(...) 131*4320e2fdSHeinrich Schuchardt<... 132*4320e2fdSHeinrich Schuchardt( 133*4320e2fdSHeinrich Schuchardt- E == 0 134*4320e2fdSHeinrich Schuchardt+ !E 135*4320e2fdSHeinrich Schuchardt| 136*4320e2fdSHeinrich Schuchardt- E != 0 137*4320e2fdSHeinrich Schuchardt+ E 138*4320e2fdSHeinrich Schuchardt| 139*4320e2fdSHeinrich Schuchardt- 0 == E 140*4320e2fdSHeinrich Schuchardt+ !E 141*4320e2fdSHeinrich Schuchardt| 142*4320e2fdSHeinrich Schuchardt- 0 != E 143*4320e2fdSHeinrich Schuchardt+ E 144*4320e2fdSHeinrich Schuchardt) 145*4320e2fdSHeinrich Schuchardt...> 146*4320e2fdSHeinrich Schuchardt?E = E1 147*4320e2fdSHeinrich Schuchardt 148*4320e2fdSHeinrich Schuchardt@t2 depends on !patch disable is_zero,isnt_zero @ 149*4320e2fdSHeinrich Schuchardtexpression *E; 150*4320e2fdSHeinrich Schuchardtexpression E1; 151*4320e2fdSHeinrich Schuchardtidentifier r.f; 152*4320e2fdSHeinrich Schuchardtposition p1; 153*4320e2fdSHeinrich Schuchardtposition p2; 154*4320e2fdSHeinrich Schuchardt@@ 155*4320e2fdSHeinrich Schuchardt 156*4320e2fdSHeinrich SchuchardtE = f(...) 157*4320e2fdSHeinrich Schuchardt<... 158*4320e2fdSHeinrich Schuchardt( 159*4320e2fdSHeinrich Schuchardt* E == 0@p1 160*4320e2fdSHeinrich Schuchardt| 161*4320e2fdSHeinrich Schuchardt* E != 0@p2 162*4320e2fdSHeinrich Schuchardt| 163*4320e2fdSHeinrich Schuchardt* 0@p1 == E 164*4320e2fdSHeinrich Schuchardt| 165*4320e2fdSHeinrich Schuchardt* 0@p1 != E 166*4320e2fdSHeinrich Schuchardt) 167*4320e2fdSHeinrich Schuchardt...> 168*4320e2fdSHeinrich Schuchardt?E = E1 169*4320e2fdSHeinrich Schuchardt 170*4320e2fdSHeinrich Schuchardt@script:python depends on org@ 171*4320e2fdSHeinrich Schuchardtp << t2.p1; 172*4320e2fdSHeinrich Schuchardt@@ 173*4320e2fdSHeinrich Schuchardt 174*4320e2fdSHeinrich Schuchardtcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E") 175*4320e2fdSHeinrich Schuchardt 176*4320e2fdSHeinrich Schuchardt@script:python depends on org@ 177*4320e2fdSHeinrich Schuchardtp << t2.p2; 178*4320e2fdSHeinrich Schuchardt@@ 179*4320e2fdSHeinrich Schuchardt 180*4320e2fdSHeinrich Schuchardtcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 181*4320e2fdSHeinrich Schuchardt 182*4320e2fdSHeinrich Schuchardt@script:python depends on report@ 183*4320e2fdSHeinrich Schuchardtp << t2.p1; 184*4320e2fdSHeinrich Schuchardt@@ 185*4320e2fdSHeinrich Schuchardt 186*4320e2fdSHeinrich Schuchardtcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E") 187*4320e2fdSHeinrich Schuchardt 188*4320e2fdSHeinrich Schuchardt@script:python depends on report@ 189*4320e2fdSHeinrich Schuchardtp << t2.p2; 190*4320e2fdSHeinrich Schuchardt@@ 191*4320e2fdSHeinrich Schuchardt 192*4320e2fdSHeinrich Schuchardtcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0") 193*4320e2fdSHeinrich Schuchardt 194*4320e2fdSHeinrich Schuchardt@ depends on patch disable is_zero,isnt_zero @ 195*4320e2fdSHeinrich Schuchardtexpression *E; 196*4320e2fdSHeinrich Schuchardt@@ 197*4320e2fdSHeinrich Schuchardt 198*4320e2fdSHeinrich Schuchardt( 199*4320e2fdSHeinrich Schuchardt E == 200*4320e2fdSHeinrich Schuchardt- 0 201*4320e2fdSHeinrich Schuchardt+ NULL 202*4320e2fdSHeinrich Schuchardt| 203*4320e2fdSHeinrich Schuchardt E != 204*4320e2fdSHeinrich Schuchardt- 0 205*4320e2fdSHeinrich Schuchardt+ NULL 206*4320e2fdSHeinrich Schuchardt| 207*4320e2fdSHeinrich Schuchardt- 0 208*4320e2fdSHeinrich Schuchardt+ NULL 209*4320e2fdSHeinrich Schuchardt == E 210*4320e2fdSHeinrich Schuchardt| 211*4320e2fdSHeinrich Schuchardt- 0 212*4320e2fdSHeinrich Schuchardt+ NULL 213*4320e2fdSHeinrich Schuchardt != E 214*4320e2fdSHeinrich Schuchardt) 215*4320e2fdSHeinrich Schuchardt 216*4320e2fdSHeinrich Schuchardt@ t3 depends on !patch disable is_zero,isnt_zero @ 217*4320e2fdSHeinrich Schuchardtexpression *E; 218*4320e2fdSHeinrich Schuchardtposition p; 219*4320e2fdSHeinrich Schuchardt@@ 220*4320e2fdSHeinrich Schuchardt 221*4320e2fdSHeinrich Schuchardt( 222*4320e2fdSHeinrich Schuchardt* E == 0@p 223*4320e2fdSHeinrich Schuchardt| 224*4320e2fdSHeinrich Schuchardt* E != 0@p 225*4320e2fdSHeinrich Schuchardt| 226*4320e2fdSHeinrich Schuchardt* 0@p == E 227*4320e2fdSHeinrich Schuchardt| 228*4320e2fdSHeinrich Schuchardt* 0@p != E 229*4320e2fdSHeinrich Schuchardt) 230*4320e2fdSHeinrich Schuchardt 231*4320e2fdSHeinrich Schuchardt@script:python depends on org@ 232*4320e2fdSHeinrich Schuchardtp << t3.p; 233*4320e2fdSHeinrich Schuchardt@@ 234*4320e2fdSHeinrich Schuchardt 235*4320e2fdSHeinrich Schuchardtcoccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") 236*4320e2fdSHeinrich Schuchardt 237*4320e2fdSHeinrich Schuchardt@script:python depends on report@ 238*4320e2fdSHeinrich Schuchardtp << t3.p; 239*4320e2fdSHeinrich Schuchardt@@ 240*4320e2fdSHeinrich Schuchardt 241*4320e2fdSHeinrich Schuchardtcoccilib.report.print_report(p[0], "WARNING comparing pointer to 0") 242