Coccinelle archive on lore.kernel.org
 help / color / Atom feed
From: Julia Lawall <julia.lawall@inria.fr>
To: Strace Labs <stracelabs@gmail.com>
Cc: Markus Elfring <Markus.Elfring@web.de>, cocci@systeme.lip6.fr
Subject: Re: [Cocci] Changing format string usage with SmPL?
Date: Tue, 3 Dec 2019 06:18:18 +0100 (CET)
Message-ID: <1865799483.10870980.1575350298758.JavaMail.zimbra@inria.fr> (raw)
In-Reply-To: <CABvP5W3E3zP28kUsmrvUOqv-Tu1YT3zvi6c=mqx+ahbMTycqAQ@mail.gmail.com>

[-- Attachment #1.1: Type: text/plain, Size: 3439 bytes --]

> 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 < [ mailto:Markus.Elfring@web.de |
> 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", [ http://h1.name/ | h1.name ] );
> my_printf("1234 %d %s @ %d %s | %s -> city=%s", id, [ http://s1.name/ | 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, [ http://s1.name/ | 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

[-- Attachment #1.2: Type: text/html, Size: 6278 bytes --]

<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De: </b>"Strace Labs" &lt;stracelabs@gmail.com&gt;<br><b>À: </b>"Markus Elfring" &lt;Markus.Elfring@web.de&gt;<br><b>Cc: </b>"Julia Lawall" &lt;julia.lawall@inria.fr&gt;, cocci@systeme.lip6.fr<br><b>Envoyé: </b>Mardi 3 Décembre 2019 11:30:14<br><b>Objet: </b>Re: [Cocci] Changing format string usage with SmPL?<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div dir="ltr"><div dir="ltr">On Sun, Dec 1, 2019 at 6:00 AM Markus Elfring &lt;<a href="mailto:Markus.Elfring@web.de" target="_blank">Markus.Elfring@web.de</a>&gt; wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">&gt; Basically, I intend to replace alls "%s" called with "mydata-&gt;name" by "%m" with "mydata" or "&amp;mydata"<br><br>
How far would you get the desired source code transformation based on<br>
software extensions around a search pattern like the following.<br>..........<br>
Which algorithm will become sufficient for your data processing needs<br>
around the usage of functions with variadic arguments because of format strings?<br><br></blockquote><br><div>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-&gt;name" and then replace by "%m" and remove the "-&gt;name"</div><br><div>e.g: Once if we have:</div><br><div>int foo() {<br>&nbsp; int id;<br>&nbsp; struct mydata h1, *h2, s1, *s2;<br>&nbsp; char *city = "Hello";<br>&nbsp; my_printf("%s", s2-&gt;name);<br>&nbsp; my_printf("hi hi %s gggg", <a href="http://h1.name" target="_blank">h1.name</a>);<br>&nbsp; my_printf("1234 %d <b>%s</b> @ %d <b>%s</b>&nbsp;| <b>%s</b> -&gt; city=%s", id, <b><a href="http://s1.name" target="_blank">s1.name</a></b>, 12, <b>(*h2).name</b>, <b>h2-&gt;name</b>, city);<br>&nbsp; my_printf("aaaa %s hhhhh", h2-&gt;name);<br>&nbsp; my_printf("%s", city);<br></div><div>}</div><br><div>Then, replace by:</div><br><div><div>int foo() {<br>&nbsp; int id;<br>&nbsp; struct mydata h1, *h2, s1, *s2;<br>&nbsp; char *city = "Hello";<br><b>my_printf("%m", s2);</b><br><b>my_printf("hi hi %s gggg", &amp;h1);</b><br>&nbsp; my_printf("1234 %d <b>%m</b>&nbsp;@ %d <b>%m</b>&nbsp;| <b>%m</b>&nbsp;-&gt; city=%s", id, <b><a href="http://s1.name" target="_blank">s1.name</a></b>, 12, <b>(*h2).name</b>, <b>h2-&gt;name</b>, city);<br><b>&nbsp; my_printf("aaaa %s hhhhh", h2);</b><br>&nbsp; my_printf("%s", city);<br></div><div>}</div></div><br><div>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 <i>Ocalm/make_expr/replace</i>. (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-&gt;name".</div><br><div>so, I still fighting yet. thanks in Advance.</div></div></div></blockquote><div>OK, if you may have more than one argument to your print, then you can find the offset using an expression list metavariable:<br></div><div><br data-mce-bogus="1"></div><div>@r@<br data-mce-bogus="1"></div><div>expression list[n] between;<br data-mce-bogus="1"></div><div>@@<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>print(s,between,h2-&gt;name,...)<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Then you can use r.n in your python rule to figure out where is the %s to change.&nbsp; Unfortunately, this will not work well if there are multiple name references in the argument list.&nbsp; 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.&nbsp; Substantial hacks would be required to deal with this.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>It would be nice if you could do<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>@r@<br data-mce-bogus="1"></div><div>expression list[bn] between;<br data-mce-bogus="1"></div><div>expression list[an] after;<br data-mce-bogus="1"></div><div>position p;<br data-mce-bogus="1"></div><div>@@<br data-mce-bogus="1"></div><div>print@p(s,between,name,after)<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>@@<br data-mce-bogus="1"></div><div>format list[r.bn] f1;<br data-mce-bogus="1"></div><div>format list[r.an] f2;<br data-mce-bogus="1"></div><div>position r.p;<br data-mce-bogus="1"></div><div>@@<br data-mce-bogus="1"></div><div>print@p(</div><div>-&nbsp;&nbsp;&nbsp; "%@f1@%s%@f2@"<br data-mce-bogus="1"></div><div>+&nbsp;&nbsp; "%@f1@%m%@f2@"<br data-mce-bogus="1"></div><div>, l)<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>I don't know if that would work, though.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>julia<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Regards,<br>
Markus<br></blockquote></div></div><br></blockquote></div></div></body></html>

[-- Attachment #2: Type: text/plain, Size: 136 bytes --]

_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

  reply index

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-28  2:11 [Cocci] Replacing printf/format calls based on the data-type Strace Labs
2019-11-28  7:07 ` Julia Lawall
2019-11-28 17:45   ` Strace Labs
2019-11-29 14:48   ` [Cocci] Replacing printf() parameters according to used data types Markus Elfring
2019-11-28  7:50 ` Markus Elfring
2019-11-29  0:35   ` Jorge Pereira
2019-11-29  8:29     ` Markus Elfring
2019-11-29 10:57       ` Strace Labs
2019-11-29 12:33         ` Markus Elfring
2019-11-29 14:47           ` Strace Labs
2019-11-29 16:08             ` Markus Elfring
2019-11-29 17:19               ` Strace Labs
2019-11-29 17:45                 ` Markus Elfring
2019-11-29 20:55             ` Julia Lawall
2019-11-30  2:25               ` Strace Labs
2019-11-30  6:35                 ` Julia Lawall
2019-11-30  8:46                 ` Markus Elfring
2019-12-01  8:00                 ` [Cocci] Changing format string usage with SmPL? Markus Elfring
2019-12-03  3:30                   ` Strace Labs
2019-12-03  5:18                     ` Julia Lawall [this message]
2019-12-03 13:28                       ` Markus Elfring
2019-12-03 15:43                       ` [Cocci] Generation of expression lists by SmPL script rules? Markus Elfring
2019-12-03 17:28                       ` [Cocci] Changing format string usage with SmPL? Strace Labs
2019-12-04  0:21                         ` Strace Labs
2019-12-06 19:36                           ` Markus Elfring
2019-12-07  7:49                           ` Markus Elfring
2019-12-04  6:47                         ` Julia Lawall
2019-12-06 19:44                           ` Markus Elfring
2019-12-06 19:20                         ` Markus Elfring
2019-12-03 10:01                     ` Markus Elfring
2019-11-30 15:11               ` [Cocci] Replacing printf() parameters according to used data types Markus Elfring

Reply instructions:

You may reply publically to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1865799483.10870980.1575350298758.JavaMail.zimbra@inria.fr \
    --to=julia.lawall@inria.fr \
    --cc=Markus.Elfring@web.de \
    --cc=cocci@systeme.lip6.fr \
    --cc=stracelabs@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Coccinelle archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/cocci/0 cocci/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 cocci cocci/ https://lore.kernel.org/cocci \
		cocci@systeme.lip6.fr
	public-inbox-index cocci

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/fr.lip6.systeme.cocci


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git