On 10/22/19 3:57 PM, Michal Privoznik wrote:
>
For future reference and anybody interested, I've made these changes using
coccinelle http://coccinelle.lip6.fr/

I've used three semantic patches (aka spatch). The first one was to rename
virAsprintfQueit() to virAsprintf(). It is trivial:

  $ cat virasprintf_rename.spatch
  @@
  @@
  -virAsprintfQuiet
  +virAsprintf

Runnig coccinelle is fairly easy now that Jano pushed the macro file [1]:

  libvirt.git $ spatch --in-place --macro-file scripts/cocci-macro-file.h \
      --sp-file virasprintf_rename.spatch --dir .


The second spatch is a bit more complicated/verbose:

   $ cat virasprintf_no_return.spatch
   @@
   expression e1, e2, e3;
   statement S;
   @@
   -if (virAsprintf(e1, e2, e3) < 0)
   -S
   +virAsprintf(e1, e2, e3);


   @@
   expression e1, e2, e3, e4;
   statement S;
   @@
   -if (virAsprintf(e1, e2, e3, e4) < 0)
   -S
   +virAsprintf(e1, e2, e3, e4);

   [this pattern continues 3 more times, each time new argument is added]

It is here that I've encountered first problems. Firstly, my spatch skills are not good enough (obviously), because I had to write several rules - each one for
different number of arguments passed to virAsprintf(). But more importantly,
I've completely missed joined statements like:

  if (virAsprintf() < 0 ||
      virAsprintf() < 0)
      goto cleanup;

On the other hand, I was left with only a few places that needed fixing.
Coccinelle did 90% of conversion and I needed to do the rest by hand, which is a
fair trade off IMO.


Finally, the last spatch was used to rewrite code from using virAsprintf() to
g_strdup_printf:

  $ cat g_strdup_printf.spatch
  @@
  expression x;
  @@
  -virAsprintf(&x,
  +x = g_strdup_printf(
   ...
   );

Again, worked perfectly except few places where we did not pass &x but x (which was char **). I've tried to make an spatch for that too but didn't succeed, so
I've fixed those places by hand.

Michal

1: Thing is, while coccinelle understands C very well, it doesn't quite
understand all those __attribute__ and other extensions. Therefore, some macros
made it impossible for coccinelle to parse some functions (e.g. g_autofree,
g_autoptr and similar) and it did not perform requested change there then.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to