On Sun, 30 Aug 2020, Joe Perches wrote:

> 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.

I will have to look into it.  It should handle this sort of thing, but it
is somewhat complex, because the declarations have to be split and this
specific case may not be handled.

One thing that is possible is to change only the variable name.  If there
are not many occurrences, one could fix them up afterwards by hand.

julia

>
>
> $ 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
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to