Unfortunately, it doesn't work. But, I am working on some solutions using Python. therefore, once we have something like: ... @r1@ format list fl; identifier fn; expression list e; position p; @@ fn("%@fl@", e@p) .... Then, I could handle the *format list* using *make_expr()* as well. But, Is it possible to rename/handle the *expression list?* On Tue, Dec 3, 2019 at 3:18 AM Julia Lawall wrote: > ------------------------------ > > *De: *"Strace Labs" > *À: *"Markus Elfring" > *Cc: *"Julia Lawall" , cocci@systeme.lip6.fr > *Envoyé: *Mardi 3 Décembre 2019 11:30:14 > *Objet: *Re: [Cocci] Changing format string usage with SmPL? > > On Sun, Dec 1, 2019 at 6:00 AM Markus Elfring > wrote: > >> > Basically, I intend to replace alls "%s" called with "mydata->name" by >> "%m" with "mydata" or "&mydata" >> >> How far would you get the desired source code transformation based on >> software extensions around a search pattern like the following. >> .......... >> Which algorithm will become sufficient for your data processing needs >> around the usage of functions with variadic arguments because of format >> strings? >> >> > Actually, I really didn't get why you're asking about that. because we are > talking about X and you're asking for Y. but, either way. that is not the > point. the point is because I am studying about the Coccinelle and I am > just trying to figure out if the tool could detect "%s" called with > "mydata->name" and then replace by "%m" and remove the "->name" > > e.g: Once if we have: > > int foo() { > int id; > struct mydata h1, *h2, s1, *s2; > char *city = "Hello"; > my_printf("%s", s2->name); > my_printf("hi hi %s gggg", h1.name); > my_printf("1234 %d *%s* @ %d *%s* | *%s* -> city=%s", id, *s1.name > *, 12, *(*h2).name*, *h2->name*, city); > my_printf("aaaa %s hhhhh", h2->name); > my_printf("%s", city); > } > > Then, replace by: > > int foo() { > int id; > struct mydata h1, *h2, s1, *s2; > char *city = "Hello"; > *my_printf("%m", s2);* > *my_printf("hi hi %s gggg", &h1);* > my_printf("1234 %d *%m* @ %d *%m* | *%m* -> city=%s", id, *s1.name > *, 12, *(*h2).name*, *h2->name*, city); > * my_printf("aaaa %s hhhhh", h2);* > my_printf("%s", city); > } > > But, I've read again the other samples and the documentation. therefore, I > didn't figure out how it should be. btw, thank you Julia for the suggestion > performing the *Ocalm/make_expr/replace*. (Due to something wrong with > the Coccinelle distributed by Brew/Osx. I just rewrote your sample using > Python and the result was the same. But, I can't just replace all "%s" by > "%m". As I said, it should be only if the "%s" was declared to use > "mydata->name". > > so, I still fighting yet. thanks in Advance. > > OK, if you may have more than one argument to your print, then you can > find the offset using an expression list metavariable: > > @r@ > expression list[n] between; > @@ > > print(s,between,h2->name,...) > > Then you can use r.n in your python rule to figure out where is the %s to > change. Unfortunately, this will not work well if there are multiple name > references in the argument list. Because you will be trying to change the > format string in multiple ways, eg once where between has length 2 and once > where between has length 4. Substantial hacks would be required to deal > with this. > > It would be nice if you could do > > @r@ > expression list[bn] between; > expression list[an] after; > position p; > @@ > print@p(s,between,name,after) > > @@ > format list[r.bn] f1; > format list[r.an] f2; > position r.p; > @@ > print@p( > - "%@f1@%s%@f2@" > + "%@f1@%m%@f2@" > , l) > > I don't know if that would work, though. > > julia > > Regards, >> Markus >> > >