[Cocci] Re: problems with typecasts

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Mar 5 17:13:49 CET 2009


On 05.03.2009 16:31, Julia Lawall wrote:
> On Thu, 5 Mar 2009, Carl-Daniel Hailfinger wrote:
>   
>> Hi,
>>
>> sorry for posting an immediate followup, but I had some progress on
>> removing redundancies from the semantic patch. However, it seems I
>> misread the SmPL grammar somewhere because I now get an error from spatch:
>> Fatal error: exception Failure("minus: parse error:
>>  = File "writeb.cocci", line 21, column 0,  charpos = 197
>>     around = '|', whole content = |
>> ")
>>     
>
> In an ( | ) the different possibilities have to be proper terms 
> (statements, expressions, whatever).  In your case, you have eg 
> "writeb(a," which is not an anything.  

That explains my earlier failed attempts as well.


> If you really want to combine them, 
> you could say:
>
>
> (
> read
> |
> write
> )
>  (...,
> - (T)
>   b)
>
> (Note that there is a space before the ( in the sixth line)
>   

Unfortunately, that semantic patch does not match any code with read
because read only takes one parameter and the pattern has a comma. If I
remove the comma from the pattern, spatch complains about invalid syntax.


> For the problem with parentheses, a possibility is to do the following, 
> etc for the read case:
>
> - a = *(b)
> + a = readb(b)
>   

Unfortunately, that won't work match the statement below because there
are no parentheses around b.
id2 = *(volatile uint8_t *)(bios + 0x01);


> In your standard.iso file you should have:
>
> Expression
> @ paren @
> expression E;
> @@
>
>  (E) => E
>
>   

Yes, that's inside my standard.iso.


> This means that something with a parenthesis will match something without 
> it as well.  So the above will also match a = *b.
>   

Good to know. There's probably some code where this feature will help me.


Regards,
Carl-Daniel


More information about the Cocci mailing list