Julia Lawall <[email protected]> writes:
> On Mon, 21 Mar 2011, Anders Wegge Keller wrote:
>
>> Julia Lawall <[email protected]> writes:
>>
>> > On Mon, 21 Mar 2011, Anders Wegge Keller wrote:
>> >
>> >> Hi,
>> >>
>> >> I've tried going over our codebase with the following script, to find
>> >> places where memory allocations are not checked before usage:
>> >>
>> >> @@
>> >> identifier ptr, fld;
>> >> @@
>> >> * ptr = dMemAlloc(...)
>> >>
>> >> ... when != (ptr != NULL)
>> >>
>> >> * ptr->fld
>> >
>> > Try:
>> >
>> > @@
>> > identifier ptr, fld;
>> > @@
>> > (
>> > (ptr = dMemAlloc(...)) == NULL
>> > |
>> > * ptr = dMemAlloc(...)
>> >
>> > ... when != (ptr != NULL)
>> >
>> > * ptr->fld
>> > )
>> >
>>
>> I see the intention, but unfortunately it doesn't parse:
>>
>> init_defs_builtins: /usr//share/coccinelle/standard.h
>> 89 92
>> Fatal error: exception Failure("minus: parse error:
>> = File "/pro/awj/Linux/Coccinelle/Unchecked_dMemAlloc.cocci", line 9,
>> column 1, charpos = 89
>> around = '...', whole content = ... when != (ptr != NULL)
>> ")
>
> OK. It's a parser ambiguity problem. If any branch of a disjunction can
> represent a statement the first one has to. Here the first branch
> represents a single expression. You could make the first branch be
> instead:
>
> if ((ptr = dMemAlloc(...)) == NULL || ...) S1 else S2
>
> where S1 and S2 are statement metavariables.
Like this?
@@
identifier ptr, fld;
statement S1,S2;
@@
(
if ((ptr = dMemAlloc(...)) == NULL || ...) S1 else S2
|
* ptr = dMemAlloc(...)
... when != (ptr != NULL)
* ptr->fld
)
The parsing is still not good:
init_defs_builtins: /usr//share/coccinelle/standard.h
164 165
Fatal error: exception Failure("minus: parse error:
= File "/pro/awj/Linux/Coccinelle/Unchecked_dMemAlloc.cocci", line 11, column
0, charpos = 164
around = ')', whole content = )
")
--
/Wegge
Leder efter redundant peering af dk.*,linux.debian.*
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)