From: josh@joshtriplett.org (Josh Triplett)
To: cocci@systeme.lip6.fr
Subject: [Cocci] Matching an absence of statements before the closing brace of a function?
Date: Sat, 2 Nov 2013 07:54:13 -0700 [thread overview]
Message-ID: <20131102145412.GT15704@leaf> (raw)
In-Reply-To: <alpine.DEB.2.02.1311021455070.2261@hadrien>
On Sat, Nov 02, 2013 at 03:27:35PM +0100, Julia Lawall wrote:
> On Sat, 2 Nov 2013, Josh Triplett wrote:
> > I wanted to write a semantic patch that matched (and removed) "return;"
> > at the end of a void function. I've attached the full .cocci file
> > written for coccicheck, but the key bit looks like this:
> >
> > @@
> > identifier fn;
> > @@
> > void fn ( ... )
> > {
> > ...
> > - return;
> > }
> >
> > However, that patch also produces results like this:
> >
> > --- a/drivers/scsi/aacraid/dpcsup.c
> > +++ b/drivers/scsi/aacraid/dpcsup.c
> > @@ -255,7 +255,6 @@ static void aac_aif_callback(void *conte
> > cpu_to_le32(NoMoreAifDataAvailable)) {
> > aac_fib_complete(fibptr);
> > aac_fib_free(fibptr);
> > - return;
> > }
> >
> > aac_intr_normal(dev, 0, 1, 0, fibptr->hw_fib_va);
> >
> > I'm guessing that either coccinelle didn't pair the braces (so that the
> > '}' matches close braces other than the one matching fn's opening brace)
> > or coccinelle allowed extra statements before the logical end of the
> > function despite the lack of '...'.
>
> The problem is that Coccinlle works on control-flow paths, and a return is
> always at the end of a control-flow path...
Not sure I fully understand what you mean. I do understand why
coccinelle works on control-flow paths rather than literal code, and
that makes it much more powerful, but I'm still not sure how coccinelle
manages to match the patch above to the code above. Do the braces in
the semantic patch above not pair with each other? If not, why not? If
so, how does "return; }" match something between the "return;" and the
"}"?
> Try the following:
>
> @start@
> identifier f;
> position p;
> @@
> f(...) {@p ... }
>
> @bad@
> position p, s != start.p;
> @@
>
> {@s <... return;@p ...> }
>
> @ef@
> position p;
> statement S;
> @@
>
> (
> while (...) return;@p
> |
> if (...) return;@p else S
> )
>
> @@
> position p != {bad.p,ef.p};
> @@
>
> - return;@p
Interesting; I didn't know about the ability to exclude specific
positions that way. However, that doesn't quite work, since it still
matches code like this:
--- a/arch/arm/mach-pxa/palmtreo.c
+++ b/arch/arm/mach-pxa/palmtreo.c
@@ -502,7 +502,6 @@ void __init treo680_gpio_init(void)
/* driving this low turns LCD on */
gpio_set_value(GPIO_NR_TREO680_LCD_EN_N, 0);
- return;
fail:
pr_err("gpio %d initialization failed\n", gpio);
gpio_free(GPIO_NR_TREO680_LCD_POWER);
I tried adding a third condition to the ef rule, like this:
@ef@
position p;
statement S;
@@
(
while (...) return;@p
|
if (...) return;@p else S
|
return;@p
S
)
However, that didn't work either. I even tried explicitly matching
labels, which seems like it should be unnecessary:
@ef@
position p;
statement S;
identifier l;
@@
(
while (...) return;@p
|
if (...) return;@p else S
|
return;@p
l: S
)
But the incorrect match above still occurred.
- Josh Triplett
next prev parent reply other threads:[~2013-11-02 14:54 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-02 13:36 [Cocci] Matching an absence of statements before the closing brace of a function? Josh Triplett
2013-11-02 14:27 ` Julia Lawall
2013-11-02 14:54 ` Josh Triplett [this message]
2013-11-02 15:02 ` Julia Lawall
2013-11-02 15:52 ` Josh Triplett
2013-11-02 16:02 ` Julia Lawall
2013-11-02 16:28 ` Josh Triplett
2013-11-02 16:34 ` Julia Lawall
2013-11-02 16:27 ` Julia Lawall
2013-11-02 21:01 ` Julia Lawall
2013-11-02 14:46 ` [Cocci] if (...) {} semantic patch Julia Lawall
2013-11-02 15:01 ` Josh Triplett
2013-11-02 15:08 ` Julia Lawall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131102145412.GT15704@leaf \
--to=josh@joshtriplett.org \
--cc=cocci@systeme.lip6.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.