On Fri, 18 Jun 2010, Nicolas Palix wrote:

> On Friday 18 June 2010 13:38:35 Eric Noulard wrote:
> > Hi all,
> > 
> > I do have a problem for writing a python scripts in  a cocci semantic patch.
> > I don't really know if it's a "feature" or a bug, the context is the 
> > following.
> > 
> > A cocci file (rule1and2.cocci) contains several rules (say 2 for the 
> > example),
> > and a single python script (at the end).
> > 
> > The python script is using matches of the rules:
> > 
> > @script:python@
> > rule1_matches << rule_1.p;
> > rule2_matches << rule_2.p;
> > 
> > @@
> > if (len(rule1_matches)>0):
> >    for m in rule1_matches:
> >        print "File <%s>, line %s" % (m.file,m.line)
> > if (len(rule2_matches)>0):
> >    for m in rule1_matches:
> >        print "File <%s>, line %s" % (m.file,m.line)
> > 
> > 
> > it looks like the script is executed iff both rules (1 & 2) matches.
> > 
> > Find attached  the files to reproduce the "problem":
> > 
> > Commands giving no output
> > spatch -sp rule1and2.cocci -no_show_diff 1-1-2.c
> > spatch -sp rule1and2.cocci -no_show_diff 1-1-1.c
> > 
> > Command giving output
> > spatch -sp rule1and2.cocci -no_show_diff 1-1-1.c 1-1-2.c
> > 
> > Is this an expected behavior?
> 
> Yes. The python code depends on rule_1.p AND rule_2.p. Thus, the python code
> is only invoked if both rule have matched.

In general, python code is only run if all variables are bound.  You can 
even exploit this to be sure that a variable is bound, even if you don't 
want to use its value.

On the other hand, this is not the case for smpl rules.  There a variable 
only has to be bound if it is needed for a given match.  An unbound 
variable causes a local failure, just like trying to match two things that 
are different, but the whole pattern could match in another way, if the 
unbound variable is in a branch of a disjunction.

julia
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to