[Cocci] Questions about if statements.
Julia Lawall
julia.lawall at lip6.fr
Thu Mar 1 09:26:40 CET 2012
If you wnt to use Nicolas's statement list solution, you can have one rule
that matches with the ... and the when, and that puts a position variable
on something useful, (the if, the { etc). Then have another rule that
rematches that position and uses the statement list in doing the
transformation.
julia
On Thu, 1 Mar 2012, Julia Lawall wrote:
> On Wed, 29 Feb 2012, Cyril Roelandt wrote:
>
>> Hello,
>>
>> I have a few questions about matching if statements in Coccinelle. Let's
>> say I want to add a call to "foo()" at the end of the body of every if
>> statement (this is a really dummy exemple, but it should show my point). I
>> wrote the following semantic patch :
>>
>> $ cat if.cocci
>> @@
>> @@
>> if (...)
>> {
>> ...
>> + foo();
>> }
>>
>> and applied it to the following C file :
>>
>> $ cat if.c
>> extern int x;
>> int
>> main(void)
>> {
>> if (x == 1)
>> {
>> bar();
>> }
>>
>> if (x == 2)
>> bar();
>> }
>>
>>
>> $ spatch -sp_file if.cocci if.c
>> init_defs_builtins: /usr/share/coccinelle/standard.h
>> HANDLING: if.c
>> diff =
>> --- if.c
>> +++ /tmp/cocci-output-22233-e7e7b8-if.c
>> @@ -18,7 +18,8 @@ main(void)
>> if (x == 1)
>> {
>> bar();
>> - }
>> + foo();
>> +}
>
> It's not really deleted then added, it's just losing it's indentation. foo()
> is probably using it. I'll look into it.
>
>>
>> if (x == 2)
>> bar();
>>
>>
>> This shows two issues :
>>
>> 1) The closing brace is deleted, and then added again, but is not properly
>> indented. Note that :
>>
>> if (...)
>> {
>> + foo();
>> ...
>> }
>>
>> produces a beautiful patch. Am I doing something wrong ?
>>
>>
>> 2) It does not match the second if statement. Should I look for both :
>>
>> if (...)
>> {
>> ...
>> }
>>
>> and
>>
>> if (...)
>> S
>>
>> or is there a nice trick that matches both ?
>
> No. Do both patterns in an ( | ) with the S case second because S will also
> match { ... }
>
> julia
> _______________________________________________
> Cocci mailing list
> Cocci at diku.dk
> http://lists.diku.dk/mailman/listinfo/cocci
> (Web access from inside DIKUs LAN only)
>
More information about the Cocci
mailing list