--- 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