[Cocci] perhaps a bug

Julia Lawall julia.lawall at lip6.fr
Sun Apr 29 20:03:47 CEST 2018



On Sun, 29 Apr 2018, Robert Larice wrote:

> Julia Lawall <julia.lawall at lip6.fr> writes:
>
> > On Sun, 29 Apr 2018, Robert Larice wrote:
> >
> >> Julia Lawall <julia.lawall at lip6.fr> writes:
> >>
> >> > On Sun, 29 Apr 2018, Robert Larice wrote:
> >> >
> >> >> Hello,
> >> >>
> >> >>   attached is a small example which does something strange
> >> >>     to a  "int i, j;" within a "#ifdef..."
> >> >>   Perhaps this points to a bug in coccinelle,
> >> >>   Would you please check ?
> >> >
> >> > Thanks for the report.  It looks like a bug.  But everything is fine if
> >> > you removed the --defined BOO.
> >> >
> >> > julia
> >>
> >> Yes, in this example it works without this --defined announcement.
> >>
> >> I stumbled on this with something more complex, which for some
> >>  reason I don't understand yet ignores a wanted transformation
> >>  in a #ifdef..#endif, except if I add such a --defined.
> >> Only then it honours my transformation, but fails with this bug.
> >
> > I don't think the --defined option has been tested much.  Perhaps without
> > the --defined there is a parse error on the function.
> >
> > julia
>
> Hello Julia,
>
>   I've attached a ripped down example to show the behaviour
>     with regard to the #ifdef
>   Without the --defined, nothing gets tranformed.
>   I don't see a parsing problem so far.
>   Perhaps you can have a look and get an idea why
>     here the --defined is important.
>   I've seen other transformations where this was not necessairy.

OK, thanks for the example.  It is indeed not a parsing problem.  When
#ifdefs are reasonably well behaved, Coccinelle internally considers them
to have a control-flow structure like an if - the code in the #ifdef might
be there or it might not.  On the other hand your rule requires that there
is exactly one i = 0 on each control-flow path through the loop.  If you
just want to remove any that happen to exist, you can instead write:

<...
- i = 0;
...>

This will also remove cases where there are multiple initializations of i
to 0 within the loop.

julia


More information about the Cocci mailing list