[Cocci] Change function invocations argument

Julia Lawall julia.lawall at lip6.fr
Sun Dec 21 12:16:30 CET 2014



On Sun, 21 Dec 2014, Eliseo Martínez wrote:

> Sorry, forget about previous message. Everything’s ok.
> As it happens sometimes, I had run over this a thousand times, but I didn’t see the pitfall until trying to explain to someone else.
> The point is that, in fact, there are no (int)(e3) or (int)e3 occurrences in my code. I hadn’t realized that before.
> First version worked right because each independent rule did it’s work on its own (rules about e3 doing nothing, but being applied after rules about e2 had already done their work).
> Second version doesn’t work because it forces a match in both e2 and e3 variants.
> This is, both approaches are not exactly equivalent, and second version doesn’t in fact match anything in my case.
> 
> So, I could just remove everything related to e3. But just for the sake of learning, I slightly modified the second version this way:
> 
> ```
> @@ typedef long_u, uintmax_t; expression e1, e2, e3; @@
> 
>     put_bytes(
>         e1,
> (
> -       (long_u)(e2)
> |
> -       (long_u)e2
> )
> +       (uintmax_t)e2
>         ,
> (
> -       (int)(e3)
> +       (unsigned int)e3
> |
> -       (int)e3
> +       (unsigned int)e3
> |
>         e3
> )
>     )
> 
> ```
> 
> And now it works great.
> Regarding what you say about moving plus lines within branches, I had indeed suspected that, and tried both versions, with identical results.
> Last version of the patch above still has a plus outside branches when dealing with e2, and it’s working great… 
> From your comment, though, it seems that’s not expected usage. So, what do you advice? should I not count of that in the future, and always replicate plus lines within branches?

Perhaps it work for expressions, but not for statements.

Anyway, it is safer to duplicate.

julia


> 
> > On 21 Dec 2014, at 11:57, Julia Lawall <julia.lawall at lip6.fr> wrote:
> > 
> > 
> > 
> > On Sun, 21 Dec 2014, Eliseo Martínez wrote:
> > 
> >> Ok. Finally I have it working. There’s still a gotcha, though.
> >> The first version of my spatch contained these rules:
> >> 
> >> ```
> >> @@ typedef long_u, uintmax_t; expression e1, e2, e3; @@
> >> 
> >> -   put_bytes(e1, (long_u)(e2), e3)
> >> +   put_bytes(e1, (uintmax_t)e2, e3)
> >> 
> >> @@ expression e1, e2, e3; @@
> >> 
> >> -   put_bytes(e1, (long_u)e2, e3)
> >> +   put_bytes(e1, (uintmax_t)e2, e3)
> >> 
> >> @@ expression e1, e2, e3; @@
> >> 
> >> -   put_bytes(e1, e2, (int)(e3))
> >> +   put_bytes(e1, e2, (unsigned int)e3)
> >> 
> >> @@ expression e1, e2, e3; @@
> >> 
> >> -   put_bytes(e1, e2, (int)e3)
> >> +   put_bytes(e1, e2, (unsigned int)e3)
> >> 
> >> ```
> >> 
> >> Those work ok.
> >> Then, I tried a second version, trying to compact those rules into a single, more expressive one:
> >> 
> >> ```
> >> @@ typedef long_u, uintmax_t; expression e1, e2, e3; @@
> >> 
> >>    put_bytes(
> >>        e1,
> >> (
> >> -       (long_u)(e2)
> >> |
> >> -       (long_u)e2
> >> )
> >> +       (uintmax_t)e2
> >>        ,
> >> (
> >> -       (int)(e3)
> >> |
> >> -       (int)e3
> >> )
> >> +       (unsigned int)e3
> >>    )
> >> 
> >> ```
> >> 
> >> That parses ok but just does nothing. So, it seems it doesn’t match anything, but I don’t understand why.
> >> Could you please explain?
> > 
> > I'm surprised that it parses OK.  Normally, you can't put + code on a 
> > disjunction.  You have to propagate it into each of the branches.  Try 
> > that.
> > 
> > julia
> > 
> > 
> >> 
> >>> On 20 Dec 2014, at 21:51, Julia Lawall <julia.lawall at lip6.fr> wrote:
> >>> 
> >>> 
> >>> 
> >>> On Sat, 20 Dec 2014, Eliseo Martínez wrote:
> >>> 
> >>>> Great. That worked. Just one more thing, please.
> >>>> Some of the replacements done by the rule before leave literals of the form “(uintmax_t)34”.
> >>>> I would like to use an unsigned constant in those cases. This is, something like “34u”. 
> >>>> So I add the following rule:
> >>>> 
> >>>> ```
> >>>> @@ expression e1, e3; constant c2; @@
> >>>> 30 
> >>>> 31 - put_bytes(e1, (uintmax_t)c2, e3)
> >>>> 32 + put_bytes(e1, c2, e3)
> >>>> ```
> >>>> 
> >>>> That does the work, except adding the “u”. How could I do that?
> >>>> Is it possible adding something literally in the output?
> >>>> Is it possible to somehow say in line 32 “render c2 but with u suffix”?
> >>> 
> >>> It is possible, but somewhat awkward.  Here is a simpler example that you 
> >>> can adapt to your case:
> >>> 
> >>> @r@
> >>> typedef uintmax_t;
> >>> constant c;
> >>> @@
> >>> 
> >>> (uintmax_t)c
> >>> 
> >>> @script:python s@
> >>> c << r.c;
> >>> cu;
> >>> @@
> >>> 
> >>> coccinelle.cu = "%su" % (c)
> >>> 
> >>> @@
> >>> constant r.c;
> >>> identifier s.cu;
> >>> @@
> >>> 
> >>> - (uintmax_t)c
> >>> + cu
> >>> 
> >>> julia
> >> 
> 
> 


More information about the Cocci mailing list