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.
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