* [Cocci] Whitelist function in rule
@ 2020-06-02 9:28 Paul Chaignon
2020-06-02 10:19 ` Julia Lawall
0 siblings, 1 reply; 5+ messages in thread
From: Paul Chaignon @ 2020-06-02 9:28 UTC (permalink / raw)
To: cocci
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;
@@
(
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
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [Cocci] Whitelist function in rule 2020-06-02 9:28 [Cocci] Whitelist function in rule Paul Chaignon @ 2020-06-02 10:19 ` Julia Lawall 2020-06-02 12:45 ` Paul Chaignon 0 siblings, 1 reply; 5+ messages in thread From: Julia Lawall @ 2020-06-02 10:19 UTC (permalink / raw) To: Paul Chaignon; +Cc: cocci 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 > Cocci@systeme.lip6.fr > https://systeme.lip6.fr/mailman/listinfo/cocci > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Cocci] Whitelist function in rule 2020-06-02 10:19 ` Julia Lawall @ 2020-06-02 12:45 ` Paul Chaignon 2020-06-02 12:55 ` Julia Lawall 0 siblings, 1 reply; 5+ messages in thread From: Paul Chaignon @ 2020-06-02 12:45 UTC (permalink / raw) To: Julia Lawall; +Cc: cocci 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 :-) 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 > > Cocci@systeme.lip6.fr > > https://systeme.lip6.fr/mailman/listinfo/cocci > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Cocci] Whitelist function in rule 2020-06-02 12:45 ` Paul Chaignon @ 2020-06-02 12:55 ` Julia Lawall 2020-06-02 18:57 ` Paul Chaignon 0 siblings, 1 reply; 5+ messages in thread From: Julia Lawall @ 2020-06-02 12:55 UTC (permalink / raw) To: Paul Chaignon; +Cc: cocci 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 > > > Cocci@systeme.lip6.fr > > > https://systeme.lip6.fr/mailman/listinfo/cocci > > > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Cocci] Whitelist function in rule 2020-06-02 12:55 ` Julia Lawall @ 2020-06-02 18:57 ` Paul Chaignon 0 siblings, 0 replies; 5+ messages in thread From: Paul Chaignon @ 2020-06-02 18:57 UTC (permalink / raw) To: Julia Lawall; +Cc: cocci On Tue, Jun 02, 2020 at 02:55:23PM +0200, Julia Lawall wrote: > > > 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. I see. I often need to whitelist simple cases like the above, so definitely useful despite limitations. Thanks again for your help! Paul > > 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 > > > > Cocci@systeme.lip6.fr > > > > https://systeme.lip6.fr/mailman/listinfo/cocci > > > > > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-06-02 18:57 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-06-02 9:28 [Cocci] Whitelist function in rule Paul Chaignon 2020-06-02 10:19 ` Julia Lawall 2020-06-02 12:45 ` Paul Chaignon 2020-06-02 12:55 ` Julia Lawall 2020-06-02 18:57 ` Paul Chaignon
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.