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