On Sun, 2020-08-30 at 17:46 +0200, Julia Lawall wrote:
> The following:
>
> @not_int_not_len exists@
> type T != int;
> identifier x != len;
> position p;
> identifier sysfs =~ "^sysfs_emit.*$";
> assignment operator aop;
> @@
>
> T@p x;
> ...
> x aop sysfs(...)
>
> @@
> type not_int_not_len.T;
> identifier not_int_not_len.x;
> position not_int_not_len.p;
> @@
>
> (
> - T@p x;
> + int len;
> - T@p x
> + int len
> = ...;
> )
> <...
> - x
> + len
> ...>
>
> works on the following test file:
>
> int fn1()
> {
> ssize_t count = 0;
> count += sysfs_emit_at(buf, count, ...);
> return count;
> }
>
> int fn2()
> {
> ssize_t count;
> count += sysfs_emit_at(buf, count, ...);
> return count;
> }
>
> In the first rule, T@p x; benefits from an isomorphism to get the
> initialization case. That is not possible in the second rule, because the
> name of the declared variable is modified.
Unfortunately this does not work when the declaration
is comma terminated and not semicolon terminated.
$ cat julia.c
int fn1()
{
ssize_t count = 0, another; // <- multiple declarations
count += sysfs_emit_at(buf, count, ...);
return count;
}
int fn2()
{
ssize_t count;
count += sysfs_emit_at(buf, count, ...);
return count;
}
$ spatch -sp-file julia.cocci julia.c
init_defs_builtins: /usr/local/bin/../lib/coccinelle/standard.h
HANDLING: julia.c
diff =
--- julia.c
+++ /tmp/cocci-output-77064-888900-julia.c
@@ -7,8 +7,8 @@ int fn1()
int fn2()
{
- ssize_t count;
- count += sysfs_emit_at(buf, count, ...);
- return count;
+ int len;
+ len += sysfs_emit_at(buf, count, ...);
+ return len;
}
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci