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

Reply via email to