On Wed, Dec 14, 2011 at 08:54:20PM +0100, Julia Lawall wrote:
> On Wed, 14 Dec 2011, Josh Triplett wrote:
> >On Wed, Dec 14, 2011 at 10:56:24AM -0800, Josh Triplett wrote:
> >>In the development of a semantic patch, I found myself writing this:
> >>
> >>@@ struct task_struct *task; @@
> >>- (task)->pid == 0
> >>+ is_idle_task(task)
> >>
> >>@@ struct task_struct *task; @@
> >>- (task)->pid != 0
> >>+ !is_idle_task(task)
> >>
> >>It seems like some way should exist to only write one of those and have
> >>coccinelle derive the other one, but I didn't manage to find it.  I'd
> >>like to avoid the redundancy if possible; any suggestions?
> >
> >Specifically, both cases work somewhat, but don't handle all code
> >correctly.  The first case misses some code, and the second case doesn't
> >produce the optimal result.  Consider the following test case:
> >
> >#include <linux/sched.h>
> >extern struct task_struct *p;
> >extern struct task_struct v;
> >void context(void)
> >{
> >     if (p->pid)
> >             do_something();
> >     if ((&v)->pid)
> >             do_something();
> >     if (!p->pid)
> >             do_something();
> >     if (!(&v)->pid)
> >             do_something();
> >}
> >
> >If I only write the first (==0) case, coccinelle manages to patch the
> >first, third, and fourth conditionals, but misses the second.  If I only
> >write the second (!=0) case, coccinelle patches all four conditionals,
> >but the third and fourth end up with !!is_idle_task rather than just
> >is_idle_task.  (Note that is_idle_task has type bool.)
> >
> >I'd like to write just one of the two cases to match all four
> >conditionals and avoid double negatives.  Ideally, either one of the two
> >cases should have that result; I don't want to have to remember a magic
> >rule for which of those variants works correctly.
> 
> What version of Coccinelle do you have?  I don't get double
> negatives for any of the examples.

1.0.0-rc7, the latest release.

~$ spatch -version
spatch version 1.0.0-rc7 with Python support and with PCRE support

- Josh Triplett
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to