| /// 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) |