De: "Strace Labs" <stracelabs@gmail.com>
À: "Julia Lawall" <julia.lawall@inria.fr>
Cc: "cocci" <cocci@systeme.lip6.fr>
Envoyé: Mercredi 4 Décembre 2019 01:28:22
Objet: Re: [Cocci] Changing format string usage with SmPL?
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?

Could you fix up the expression list first?  Then you can write a rule like

char[] s;

fn(s, ...,
- oldcode
+ newcode
   ,...)

julia







On Tue, Dec 3, 2019 at 3:18 AM Julia Lawall <julia.lawall@inria.fr> wrote:

De: "Strace Labs" <stracelabs@gmail.com>
À: "Markus Elfring" <Markus.Elfring@web.de>
Cc: "Julia Lawall" <julia.lawall@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.Elfring@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, 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