On Tue, 2 Jun 2020, Paul Chaignon wrote:
> On Tue, Jun 02, 2020 at 12:19:50PM +0200, Julia Lawall wrote:
> >
> >
> > On Tue, 2 Jun 2020, Paul Chaignon wrote:
> >
> > > Hi all,
> > >
> > > I'm trying to find calls to ep_tail_call() that are *not* followed by
> > > 'return DROP_MISSED_TAIL_CALL'. That works fine (rule1 below), but I then
> > > want to whitelist one specific function, send_drop_notify().
> > >
> > > I couldn't find a way to do that from the first rule, so I whitelisted
> > > send_drop_notify() with a second rule (rule2 below). That seems rather
> > > cumbersome and I'm wondering if there's maybe a simpler approach?
> > >
> > > @rule1@
> > > position p1;
> >
> > In coccinelle/tests/python_poscon.cocci you have an example of how to
> > attach python code to a metavariable:
> >
> > @initialize:python@
> > @@
> >
> > def past_line_4(p, other):
> > return int(p[0].line) > 4
> >
> > @r@
> > expression e;
> > @@
> >
> > f(e)
> >
> > @@
> > position p : script:python(r.e) { past_line_4(p, e) };
> > expression r.e;
> > @@
> >
> > g(
> > -e@p
> > +27
> > )
> >
> > In your case, I think that in the python code you should be able to access
> > p1[0].current_element. You can check that that is different than the
> > name of the function that you want to ignore. There are some limitations
> > on what can be put in the {} in such a metavariable declaration, so if you
> > have problems you can make a function, as shown in the example. That code
> > should return true if you want the match to take place and false
> > otherwise.
>
> Thanks! That worked great!
> And the Python filtering looks super useful; I'm likely going to be
> using that a lot :-)
You can refer to other metavariables, as illustrated by the example in
tests, but they have to be nearby, ie no ... between them, and there
should be no disjunctions involved. This is to ensure that the matchig
that led to th metavariable binding is deterministic. If you violate
these constraints, Coccinelle will complain, and you will have to make a
separate python rule in the normal way.
julia
>
> Paul
>
> >
> > julia
> >
> >
> >
> > > @@
> > >
> > > (
> > > ep_tail_call(...);
> > > ... when forall
> > > return DROP_MISSED_TAIL_CALL;
> > > |
> > > ep_tail_call@p1(...);
> > > )
> > >
> > > @rule2@
> > > position p2, rule1.p1;
> > > identifier fn != send_drop_notify;
> > > @@
> > >
> > > fn(...) {
> > > <+...
> > > ep_tail_call@p1@p2(...);
> > > ...+>
> > > }
> > >
> > > When I tried using rule1 as the body of the function in rule2, it just
> > > didn't match anything anymore.
> > >
> > > Thanks,
> > > Paul
> > > _______________________________________________
> > > Cocci mailing list
> > > [email protected]
> > > https://systeme.lip6.fr/mailman/listinfo/cocci
> > >
>
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci