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

Reply via email to