Hi Pierre,
Does these examples suit you ?
t.cocci seems to highlight what you want.
I expect t2 to do the same thing in a simpler way,
but t_pop calls are not filtered out properly.
Julia, can you check I am doing it right ?
Excerpt of t2:
@r_push@
position p_push;
@@
t_p...@p_push();
@r_pop@
position p_pop;
@@
t_...@p_pop();
@r1@
type t;
position p;
position p2 != {r_push.p_push, r_pop.p_pop};
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
... when != t_push();
*...@p2(...);
...
}
On Wednesday 23 June 2010 13:15:52 Pierre Habouzit wrote:
>
> Hi, I'm trying to write a rule that checks a syntaxic coding rule we
> have at work. We have this stacked allocator, that has two functions:
> t_push()/t_pop() placing marks on an allocation mark.
>
> Any t_* allocation performed since a given t_push() is deallocated after
> the next t_pop().
>
> Some of our functions use this stack to do their stuff, some leave it
> untouched, some return results allocated on it (for example we have a
> t_sprintf).
>
> Our coding rule is that any function that allocates on the stack without
> guarding the allocation by t_push()/t_pop() should have a name starting
> with t_.
>
> I've written the attached .cocci. Though run on the following test:
>
> void f1(void)
> {
> t_push();
> t_foo();
> t_pop();
> }
>
> void f2(void)
> {
> t_foo();
> }
>
> void f3(void)
> {
> t_bar();
> t_push();
> t_foo();
> t_pop();
> }
>
>
> void f4(void)
> {
> t_push();
> t_foo();
> t_pop();
> t_bar();
> }
>
> I expected it to yield errors for f2-f4, but it only does for f2.
> Further investigation shows that it doesn't even report:
>
> void f(void) {
> t_something();
> t_somethingelse();
> }
>
> Any idea if I'm doing something wrong or if that's a coccinelle bug ?
>
--
Nicolas Palix
Web: http://www.diku.dk/~npalix/
@r_pop@
position p_pop;
@@
t_...@p_pop();
@r1@
type t;
position p;
position p2 != r_pop.p_pop;
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
... when != t_push();
*...@p2(...);
...
t_push();
...
}
@script:python@
x << r1.p;
f << r1.f;
g << r1.g;
@@
print "%s:%s:%s:%s should be named t_%s" % (x[0].file, x[0].line, x[0].column,
f, f)
@r2@
type t;
position p;
position p2 != r_pop.p_pop;
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
...
t_pop();
...
*...@p2(...);
... when != t_pop();
}
@script:python@
x << r2.p;
f << r2.f;
g << r2.g;
@@
print "%s:%s:%s:%s should be named t_%s" % (x[0].file, x[0].line, x[0].column,
f, f)
@r3@
type t;
position p;
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
... when != t_push();
*g(...);
... when != t_pop();
}
@script:python@
x << r3.p;
f << r3.f;
g << r3.g;
@@
print "%s:%s:%s:%s should be named t_%s" % (x[0].file, x[0].line, x[0].column,
f, f)
@r_push@
position p_push;
@@
t_p...@p_push();
@r_pop@
position p_pop;
@@
t_...@p_pop();
@r1@
type t;
position p;
position p2 != {r_push.p_push, r_pop.p_pop};
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
... when != t_push();
*...@p2(...);
...
}
@script:python@
x << r1.p;
f << r1.f;
g << r1.g;
@@
print "%s:%s:%s:%s should be named t_%s" % (x[0].file, x[0].line, x[0].column,
f, f)
@r2@
type t;
position p;
position p2 != {r_push.p_push, r_pop.p_pop};
identifier f !~= "^t_.*$";
identifier g ~= "^t_.*$";
@@
t f...@p(...) {
...
*...@p2(...);
... when != t_pop();
}
@script:python@
x << r2.p;
f << r2.f;
g << r2.g;
@@
print "%s:%s:%s:%s should be named t_%s" % (x[0].file, x[0].line, x[0].column,
f, f)
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)