> f(...){
> + Mach *m = machp();
> ...
> x = m
> ...
> }
This requires there to be exactly one occurrence of x = m on every (non
failing) execution path.
>
> The x = m could also be m->x, or if (m) s, and so on
Do you just mean any reference to m at all? Or do you mean any reference
that is not an assignment to m, ie not m = x.
If you want to allow any kind of reference to m, you could do:
@r exists@
typedef Mach; // only needed once per semantic patch
idexpression Mach *m;
function f;
position p;
@@
f@p(...){
<+...
m
...+>
}
@@
identifier r.f;
position r.p;
idexpression Mach *r.m;
@@
f@p(...) {
++Mach *m;
...
}
There could be more than one Mach * typed variable in a function. The ++
lets them all get added, but there is no way to know in what order they
will appear.
Otherwise, the idea here is that if there ever exists an m in the
function, then add the declaration to the function. It might be possible
to merge the two rules, as:
@r exists@
typedef Mach; // only needed once per semantic patch
idexpression Mach *m;
function f;
@@
f(...){
++ Mach *m;
<+...
m
...+>
}
But that might give multiple declarations of the same variable, if it is
used in more than one execution path.
Also, it might be possible to say global idexpression Mach *m. I don't
remember if that is in the current release or in the upcoming one.
julia
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci