%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
// SPDX-License-Identifier: GPL-2.0-only /// Compare pointer-typed values to NULL rather than 0 /// //# This makes an effort to choose between !x and x == NULL. !x is used //# if it has previously been used with the function used to initialize x. //# This relies on type information. More type information can be obtained //# using the option -all_includes and the option -I to specify an //# include path. // // Confidence: High // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // URL: http://coccinelle.lip6.fr/ // Requires: 1.0.0 // Options: virtual patch virtual context virtual org virtual report @initialize:ocaml@ @@ let negtable = Hashtbl.create 101 @depends on patch@ expression *E; identifier f; @@ ( (E = f(...)) == - 0 + NULL | (E = f(...)) != - 0 + NULL | - 0 + NULL == (E = f(...)) | - 0 + NULL != (E = f(...)) ) @t1 depends on !patch@ expression *E; identifier f; position p; @@ ( (E = f(...)) == * 0@p | (E = f(...)) != * 0@p | * 0@p == (E = f(...)) | * 0@p != (E = f(...)) ) @script:python depends on org@ p << t1.p; @@ coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") @script:python depends on report@ p << t1.p; @@ coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") // Tests of returned values @s@ identifier f; expression E,E1; @@ E = f(...) ... when != E = E1 !E @script:ocaml depends on s@ f << s.f; @@ try let _ = Hashtbl.find negtable f in () with Not_found -> Hashtbl.add negtable f () @ r disable is_zero,isnt_zero exists @ expression *E; identifier f; @@ E = f(...) ... (E == 0 |E != 0 |0 == E |0 != E ) @script:ocaml@ f << r.f; @@ try let _ = Hashtbl.find negtable f in () with Not_found -> include_match false // This rule may lead to inconsistent path problems, if E is defined in two // places @ depends on patch disable is_zero,isnt_zero @ expression *E; expression E1; identifier r.f; @@ E = f(...) <... ( - E == 0 + !E | - E != 0 + E | - 0 == E + !E | - 0 != E + E ) ...> ?E = E1 @t2 depends on !patch disable is_zero,isnt_zero @ expression *E; expression E1; identifier r.f; position p1; position p2; @@ E = f(...) <... ( * E == 0@p1 | * E != 0@p2 | * 0@p1 == E | * 0@p1 != E ) ...> ?E = E1 @script:python depends on org@ p << t2.p1; @@ coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E") @script:python depends on org@ p << t2.p2; @@ coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") @script:python depends on report@ p << t2.p1; @@ coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E") @script:python depends on report@ p << t2.p2; @@ coccilib.report.print_report(p[0], "WARNING comparing pointer to 0") @ depends on patch disable is_zero,isnt_zero @ expression *E; @@ ( E == - 0 + NULL | E != - 0 + NULL | - 0 + NULL == E | - 0 + NULL != E ) @ t3 depends on !patch disable is_zero,isnt_zero @ expression *E; position p; @@ ( * E == 0@p | * E != 0@p | * 0@p == E | * 0@p != E ) @script:python depends on org@ p << t3.p; @@ coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0") @script:python depends on report@ p << t3.p; @@ coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")