coccinelle: misc: semantic patch to delete overly complex return code processing
This semantic patch simplifies cases where the effect of the processing of a function call's return code is just to return the result of the function directly. It may also delete a local return flag variable, if this is no longer used. This was proposed by Uwe Kleine-König. Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
parent
22739edfc5
commit
932058a5d5
1 changed files with 180 additions and 0 deletions
180
scripts/coccinelle/misc/simple_return.cocci
Normal file
180
scripts/coccinelle/misc/simple_return.cocci
Normal file
|
@ -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)
|
Loading…
Add table
Reference in a new issue