// 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: https://coccinelle.gitlabpages.inria.fr/website// Requires: 1.0.0// Options:virtual patchvirtual contextvirtual orgvirtual 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")
// 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: https://coccinelle.gitlabpages.inria.fr/website
// 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")