* [Cocci] How to match a part of a rule expression (documentation)
@ 2020-06-03 17:33 Denis Efremov
2020-06-03 19:45 ` Julia Lawall
0 siblings, 1 reply; 4+ messages in thread
From: Denis Efremov @ 2020-06-03 17:33 UTC (permalink / raw)
To: Coccinelle
Hi,
I'm trying to write a rule to match consecutive function calls. For example:
@r@
expression E, E1;
@@
call_func(E);
... when != E = E1
* call_func(E);
It works well, but not in case "E == p->f" and p is updated in between calls.
So, I'm to understand how can I avoid these kind of pointers update.
And fail case example:
struct test {
int a;
};
void call_func(int);
void test(void)
{
struct test t[10];
struct test *i;
for(i = t; i < i + 10; ++i) {
call_func(i->a);
}
}
While I tried to figure it out, I faced some cocci constructions with no documentation.
For example, what are rulekinds, "when strict", and "expression *r.E;", "expression E1 <= r.E;"?
1)
main_grammar.pdf, page 2:
rulekind ::= expression
identifier
type
What is it and how it could be used? I see that it's used in deref_null.cocci, doublebitand.cocci.
2)
What is "... when strict"? Is it negation of "... when any" and enabled by default?
3) What is "expression *r.E;" in ./null/deref_null.cocci, for example:
43:expression *E;
54:expression *ifm.E;
115:expression *ifm.E;
175:expression *ifm.E;
239:expression *E;
248:expression *ifm1.E;
4) What is "expression <= " in ./null/deref_null.cocci?
53:expression subE <= ifm.E;
114:expression subE <= ifm.E;
174:expression subE <= ifm.E;
247:expression subE <= ifm1.E;
Regards,
Denis
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Cocci] How to match a part of a rule expression (documentation) 2020-06-03 17:33 [Cocci] How to match a part of a rule expression (documentation) Denis Efremov @ 2020-06-03 19:45 ` Julia Lawall 2020-06-03 22:09 ` Denis Efremov 0 siblings, 1 reply; 4+ messages in thread From: Julia Lawall @ 2020-06-03 19:45 UTC (permalink / raw) To: Denis Efremov; +Cc: Coccinelle On Wed, 3 Jun 2020, Denis Efremov wrote: > Hi, > > I'm trying to write a rule to match consecutive function calls. For example: > @r@ > expression E, E1; > @@ > > call_func(E); > ... when != E = E1 > * call_func(E); > > It works well, but not in case "E == p->f" and p is updated in between calls. > So, I'm to understand how can I avoid these kind of pointers update. > > And fail case example: > > struct test { > int a; > }; > > void call_func(int); > > void test(void) > { > struct test t[10]; > struct test *i; > for(i = t; i < i + 10; ++i) { > call_func(i->a); > } > } > > > While I tried to figure it out, I faced some cocci constructions with no documentation. > For example, what are rulekinds, "when strict", and "expression *r.E;", "expression E1 <= r.E;"? > > 1) > main_grammar.pdf, page 2: > rulekind ::= expression > identifier > type > > What is it and how it could be used? I see that it's used in deref_null.cocci, doublebitand.cocci. Some times it is not clear what kind of term a semantic patch should match. For example, if the semantic patch is: @@ @@ - x + y should f.x be converted to f.y. Actually, it will not. By default a semantic patch rule is parsed as a statement or an expression. But x in f.x is an identifier. So if you really want to replace all the x's by y's no matter what they are used for, you would put @identifier@ on the first line of the semantic patch. Putting expression can avoid some parsing ambiguities. I'm not sure that type is actually useful, because Coccinelle should be able to figure out what is a type by itself, at least with the typedef declaration. > > 2) > What is "... when strict"? Is it negation of "... when any" and enabled by default? When strict is unrelated to when any and it is not emabled by default. In a transformation rule, by default A ... B requires that there is a B after A on every control-flow path. But that is not reasonable if between A and B there is some code that checks for an error condition and if one is found aborts the function. So by default the condition of A always followed by B does not require B on such error paths. Sometimes, however, eg for locks and unlocks, you want B to appear in error handling code too. In that case you would put when strict, to be sure B really appears in all paths. When any has to do with the constraint that when you have A ... B you want the A that is closest to B. That is the default. If you put when any, you get any B that is after A. > 3) What is "expression *r.E;" in ./null/deref_null.cocci, for example: > 43:expression *E; > 54:expression *ifm.E; > 115:expression *ifm.E; > 175:expression *ifm.E; > 239:expression *E; > 248:expression *ifm1.E; Any expression that is a pointer. You can also say expression struct. > 4) What is "expression <= " in ./null/deref_null.cocci? > 53:expression subE <= ifm.E; > 114:expression subE <= ifm.E; > 174:expression subE <= ifm.E; > 247:expression subE <= ifm1.E; subE is a expressionof whatever expression was previously matched to E in the rule ifm. <= can only be used when the metavariable on the right side is inherited from another rule. Ths is probably what you want for your problem. julia > > Regards, > Denis > _______________________________________________ > 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] 4+ messages in thread
* Re: [Cocci] How to match a part of a rule expression (documentation) 2020-06-03 19:45 ` Julia Lawall @ 2020-06-03 22:09 ` Denis Efremov 2020-06-04 7:31 ` Julia Lawall 0 siblings, 1 reply; 4+ messages in thread From: Denis Efremov @ 2020-06-03 22:09 UTC (permalink / raw) To: Julia Lawall; +Cc: Coccinelle On 6/3/20 10:45 PM, Julia Lawall wrote: > subE is a expressionof whatever expression was previously matched to E in > the rule ifm. <= can only be used when the metavariable on the right side > is inherited from another rule. Ths is probably what you want for your > problem. In this case I don't understand the difference between: "expression ifm.E" and "expression subE <= ifm.E" For example, in kfree.cocci: @r exists@ expression free.E, subE<=free.E, E2; expression E1; ... @@ ( * kfree@p1(E,...) | * kzfree@p1(E,...) ) ... ( iter(...,subE,...) S // no use | list_remove_head(E1,subE,...) | subE = E2 Regards, Denis _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Cocci] How to match a part of a rule expression (documentation) 2020-06-03 22:09 ` Denis Efremov @ 2020-06-04 7:31 ` Julia Lawall 0 siblings, 0 replies; 4+ messages in thread From: Julia Lawall @ 2020-06-04 7:31 UTC (permalink / raw) To: Denis Efremov; +Cc: Coccinelle [-- Attachment #1: Type: text/plain, Size: 944 bytes --] On Thu, 4 Jun 2020, Denis Efremov wrote: > On 6/3/20 10:45 PM, Julia Lawall wrote: > > subE is a expressionof whatever expression was previously matched to E in > > the rule ifm. <= can only be used when the metavariable on the right side > > is inherited from another rule. Ths is probably what you want for your > > problem. > > In this case I don't understand the difference between: > > "expression ifm.E" and "expression subE <= ifm.E" subE should match any subexpression of ifm.E. If you have a concrete example (code and semantic patch) where it is not doing that, I can look at it. I haven't used this feature very much. julia > > For example, in kfree.cocci: > > @r exists@ > expression free.E, subE<=free.E, E2; > expression E1; > ... > @@ > > ( > * kfree@p1(E,...) > | > * kzfree@p1(E,...) > ) > ... > ( > iter(...,subE,...) S // no use > | > list_remove_head(E1,subE,...) > | > subE = E2 > > > Regards, > > Denis > > [-- Attachment #2: Type: text/plain, Size: 136 bytes --] _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-06-04 20:41 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-06-03 17:33 [Cocci] How to match a part of a rule expression (documentation) Denis Efremov 2020-06-03 19:45 ` Julia Lawall 2020-06-03 22:09 ` Denis Efremov 2020-06-04 7:31 ` Julia Lawall
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox