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