OK, it works better if you put ... when any before the final ) julia
On Mon, 21 Mar 2011, Anders Wegge Keller wrote: > 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) > _______________________________________________ Cocci mailing list [email protected] http://lists.diku.dk/mailman/listinfo/cocci (Web access from inside DIKUs LAN only)
