--- Please note the new email address --- On Sat, 30 Nov 2019, Strace Labs wrote: > Hi Julia, > > Thanks for the suggestion. But, It is working partially... I am not sure if > Coccinelle is able to filter the %fmt e.g: %s only called with a parameter > of specific data-type. In my case, {struct mydata }.name and { struct mydata > *}->name. > > #####  Cocci > @r1@ > format list d; > identifier fn; > @@ > > fn("%@d@", ...) There is no need to put ... here if you want to specify something else. julia > @script:ocaml s1@ > d << r1.d; > res; > @@ > res := make_expr ("\""^(String.concat "%m" > (Str.split_delim(Str.regexp_string "%s") d))^"\"") > > @main depends on s1 && r1@ > format list r1.d; > expression s1.res; > identifier r1.fn; > struct mydata SMD; > struct mydata* SMDP; > @@ > >  fn( > -"%@d@" > +res > , > ( > + & >   SMD > - .name > | >   SMDP > - ->name > ) >  ); >   > #####  .c Code sample > int foo() { > int id; > struct mydata h1, *h2, s1, *s2; > char *city; > > // works fine > my_printf("%s", s2->name); > > // works without any criterions about the data type of %fmt > my_printf("sss %s gggg", h1.name); > my_printf("33131231313 %d %s %d %s hhhhh", id, s1.name, (*h2)->name, > h2->name); > my_printf("aaaa %s hhhhh", h2->name); > my_printf("%s", s2->name); > > // should do nothing > my_printf("%s"); > my_printf("%s", city); > > // don't match. > my_printf("a %s %d", h2->name, id); > my_printf("ddddd %s %s %s", h2->name, city, h2->name); > my_printf("%d it would work but dunno mydata=%m\n", id, h2); > my_printf("%d here also, tt=%s | %s and %m\n", id, h2->name, h2->name, s2); > } > > #### Result > HANDLING: /Volumes/Users/test/Coccinella/sample.c > diff = > --- /Volumes/Users/test/Coccinella/sample.c > +++ /tmp/cocci-output-99329-3a9829-sample.c > @@ -5,13 +5,13 @@ int foo() { >   char *city; > >   // works fine > - my_printf("%s", s2->name); > + my_printf("%m", s2); > >   // works without any criterious about the data type of %fmt > - my_printf("sss %s gggg", h1.name); > + my_printf("sss %m gggg", &h1); >   my_printf("33131231313 %d %s %d %s hhhhh", id, s1.name, (*h2)->name, > h2->name); > - my_printf("aaaa %s hhhhh", h2->name); > - my_printf("%s", s2->name); > + my_printf("aaaa %m hhhhh", h2); > + my_printf("%m", s2); > >   // should do nothing >   my_printf("%s"); > > > Basically, I intend to replace alls "%s" called with "mydata->name" by "%m" > with "mydata" or "&mydata" > > > > > > On Fri, Nov 29, 2019 at 6:55 PM Julia Lawall wrote: > Maybe this will help you: > > @r@ > format list d; > @@ > > "%@d@" > > @script:ocaml s@ > d << r.d; > res; > @@ > res := make_expr ("\""^(String.concat "%s" (Str.split_delim > (Str.regexp_string "%d") d))^"\"") > > > @@ > format list r.d; > expression s.res; > @@ > > -"%@d@" > +res > > --------------- > > Example: > > int main() { >   printf("some %d more\n", 12); > } > > int main() { >   printf("%d more\n", 12); > } > > int main() { >   printf("more %d\n", 12); > } > > int main() { >   printf("%d more %d\n", 12); > } > > julia > > >