|
@@ -0,0 +1,180 @@
|
|
|
+/// Simplify a trivial if-return sequence. Possibly combine with a
|
|
|
+/// preceding function call.
|
|
|
+//
|
|
|
+// Confidence: High
|
|
|
+// Copyright: (C) 2014 Julia Lawall, INRIA/LIP6. GPLv2.
|
|
|
+// Copyright: (C) 2014 Gilles Muller, INRIA/LiP6. GPLv2.
|
|
|
+// URL: http://coccinelle.lip6.fr/
|
|
|
+// Comments:
|
|
|
+// Options: --no-includes --include-headers
|
|
|
+
|
|
|
+virtual patch
|
|
|
+virtual context
|
|
|
+virtual org
|
|
|
+virtual report
|
|
|
+
|
|
|
+@r depends on patch@
|
|
|
+local idexpression e;
|
|
|
+identifier i,f,fn;
|
|
|
+@@
|
|
|
+
|
|
|
+fn(...) { <...
|
|
|
+- e@i =
|
|
|
++ return
|
|
|
+ f(...);
|
|
|
+-if (i != 0) return i;
|
|
|
+-return 0;
|
|
|
+...> }
|
|
|
+
|
|
|
+@depends on patch@
|
|
|
+identifier r.i;
|
|
|
+type t;
|
|
|
+@@
|
|
|
+
|
|
|
+-t i;
|
|
|
+ ... when != i
|
|
|
+
|
|
|
+@depends on patch@
|
|
|
+expression e;
|
|
|
+@@
|
|
|
+
|
|
|
+-if (e != 0)
|
|
|
+ return e;
|
|
|
+-return 0;
|
|
|
+
|
|
|
+// -----------------------------------------------------------------------
|
|
|
+
|
|
|
+@s1 depends on context || org || report@
|
|
|
+local idexpression e;
|
|
|
+identifier i,f,fn;
|
|
|
+position p,p1,p2;
|
|
|
+@@
|
|
|
+
|
|
|
+fn(...) { <...
|
|
|
+* e@i@p = f(...);
|
|
|
+ if (\(i@p1 != 0\|i@p2 < 0\))
|
|
|
+ return i;
|
|
|
+ return 0;
|
|
|
+...> }
|
|
|
+
|
|
|
+@s2 depends on context || org || report forall@
|
|
|
+identifier s1.i;
|
|
|
+type t;
|
|
|
+position q,s1.p;
|
|
|
+expression e,f;
|
|
|
+@@
|
|
|
+
|
|
|
+* t i@q;
|
|
|
+ ... when != i
|
|
|
+ e@p = f(...);
|
|
|
+
|
|
|
+@s3 depends on context || org || report@
|
|
|
+expression e;
|
|
|
+position p1!=s1.p1;
|
|
|
+position p2!=s1.p2;
|
|
|
+@@
|
|
|
+
|
|
|
+*if (\(e@p1 != 0\|e@p2 < 0\))
|
|
|
+ return e;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+// -----------------------------------------------------------------------
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s1.p;
|
|
|
+p1 << s1.p1;
|
|
|
+q << s2.q;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("decl",q)
|
|
|
+cocci.print_secs("use",p)
|
|
|
+cocci.include_match(False)
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s1.p;
|
|
|
+p2 << s1.p2;
|
|
|
+q << s2.q;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("decl",q)
|
|
|
+cocci.print_secs("use with questionable test",p)
|
|
|
+cocci.include_match(False)
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s1.p;
|
|
|
+p1 << s1.p1;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("use",p)
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s1.p;
|
|
|
+p2 << s1.p2;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("use with questionable test",p)
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s3.p1;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("test",p)
|
|
|
+
|
|
|
+@script:python depends on org@
|
|
|
+p << s3.p2;
|
|
|
+@@
|
|
|
+
|
|
|
+cocci.print_main("questionable test",p)
|
|
|
+
|
|
|
+// -----------------------------------------------------------------------
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s1.p;
|
|
|
+p1 << s1.p1;
|
|
|
+q << s2.q;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns can be simpified and declaration on line %s can be dropped" % (q[0].line)
|
|
|
+coccilib.report.print_report(p[0],msg)
|
|
|
+cocci.include_match(False)
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s1.p;
|
|
|
+p1 << s1.p1;
|
|
|
+q << s2.q
|
|
|
+;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns may be simpified if negative or 0 value and declaration on line %s can be dropped" % (q[0].line)
|
|
|
+coccilib.report.print_report(p[0],msg)
|
|
|
+cocci.include_match(False)
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s1.p;
|
|
|
+p1 << s1.p1;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns can be simpified"
|
|
|
+coccilib.report.print_report(p[0],msg)
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s1.p;
|
|
|
+p2 << s1.p2;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns can be simpified if negative or 0 value"
|
|
|
+coccilib.report.print_report(p[0],msg)
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s3.p1;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns can be simpified"
|
|
|
+coccilib.report.print_report(p[0],msg)
|
|
|
+
|
|
|
+@script:python depends on report@
|
|
|
+p << s3.p2;
|
|
|
+@@
|
|
|
+
|
|
|
+msg = "WARNING: end returns can be simpified if tested value is negative or 0"
|
|
|
+coccilib.report.print_report(p[0],msg)
|