Hello, julia and folks,
I found the following source code (deadcode.c) isn't updated by semantic
patch (deadcode.cooci) with spatch version 1.0.4.

[deadcode.c]
int deadcode(const char* c)
{
    do {
        if (c) {
            foo(*c);
            break;
        }
        break;
    } while (0);
}

[deadcode.cocci]
@@
expression E;
@@
-foo(E)
+bar(E)

With `--debug` option, spatch shows `FLOW: deadcode detected: File
"./deadcode.c", line 3`. But, I think there is no deadcode. There is
just a redundant `break` at the end of the loop. In my opinion, although
it's a bit strange, `break` keyword is harmless like the last `break`
keyword in the last label block in a `switch` statement, e.g.

switch (*c) {
  case 'x': x++; break;
  case 'y': y++; break;
  default:
    warn("Invalid input: %c\n", *c);
    break; // <-- this is harmless, not a deadcode
}

Practical issue is seen in Wine 2.7's dlls/shlwapi/url.c from line 707
to 874. I tried to replace isalnum() to isalnumW(), a WCHAR version of
isalnum(), at line 812. However, spatch missed it without warnings. You
can see https://source.winehq.org/source/dlls/shlwapi/url.c?v=wine-2.7#0707
for the source code.

I'll be happy if spatch finds out the above case and makes a patch for it.
Deadcode.{c,cocci} are available in the Github pull requests.

Thanks in advance,
Akihiro Sagawa

_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to