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)

Reply via email to