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 <[email protected]> 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 <[email protected]> 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 > >> > >
_______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
