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 <julia.law...@inria.fr> wrote:

> ------------------------------
>
> *De: *"Strace Labs" <stracel...@gmail.com>
> *À: *"Markus Elfring" <markus.elfr...@web.de>
> *Cc: *"Julia Lawall" <julia.law...@inria.fr>, 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 <markus.elfr...@web.de>
> 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
> <http://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
> <http://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
>>
>
>
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to