Hello,

I'm new to Coccinelle and there's a patch I wrote that doesn't
work as I expected.

The purpose of the patch is to implement a toy stack smashing
protector by inserting a local variable with a unique name, by
using 'fresh identifier', in every function and checking its
value before returning.

The patch is the followig:
----8<----8<----8<----8<----8<----8<----
@@
identifier fn;
fresh identifier canary = "canary_";
@@
 fn (...)
 {
+  int canary = 0xdeadbeef;
   ...
+  if ((canary ^ 0xdeadbeef) != 0)
+      DIVIDE_BY_ZERO;
  return ...;
 }
---->8---->8---->8---->8---->8---->8----

I tried it on a simple function, like the one below:

----8<----8<----8<----8<----8<----8<----
int fn (int a, int b)
{
        if (a > b)
                return a - b;
        return 0;
}
---->8---->8---->8---->8---->8---->8----

and got the expected result. The generated patch follows.

----8<----8<----8<----8<----8<----8<----
init_defs_builtins: /usr/lib/coccinelle/standard.h
HANDLING: branch.c
diff = 
--- branch.c
+++ /tmp/cocci-output-3058-7f8e45-branch.c
@@ -1,6 +1,12 @@
 int fn (int a, int b)
 {
-       if (a > b)
+       int canary_0 = 0xdeadbeef;
+       if (a > b) {
+               if ((canary_0 ^ 0xdeadbeef) != 0)
+                       DIVIDE_BY_ZERO;
                return a - b;
+       }
+       if ((canary_0 ^ 0xdeadbeef) != 0)
+               DIVIDE_BY_ZERO;
        return 0;
 }
---->8---->8---->8---->8---->8---->8----

But as soon as I add an elseif branch the patch stops working.
Here are the code

----8<----8<----8<----8<----8<----8<----
int fn (int a, int b)
{
        if (a > b)
                return a - b;
        else if (b > a)
                return b - a;
        return 0;
}
---->8---->8---->8---->8---->8---->8----

and 'spatch --debug' output:

----8<----8<----8<----8<----8<----8<----
init_defs_builtins: /usr/lib/coccinelle/standard.h
-----------------------------------------------------------------------
processing semantic patch file: ssp.cocci
with isos from: /usr/lib/coccinelle/standard.iso
-----------------------------------------------------------------------
@@
identifier fn;
fresh identifier canary = "canary_";
@@
 fn (...)
 {
+  int canary = 0xdeadbeef;
   ...
+  if ((canary ^ 0xdeadbeef) != 0)
+      DIVIDE_BY_ZERO;
   return ...;
 }

HANDLING: elseif.c
-----------------------------------------------------------------------
let's go
-----------------------------------------------------------------------
-----------------------------------------------------------------------
-----------------------------------------------------------------------
rule starting on line 1 = 
-----------------------------------------------------------------------
dependencies for rule rule starting on line 1 satisfied:
binding in = []
binding relevant in = []
-----------------------------------------------------------------------
Finished
-----------------------------------------------------------------------
Check duplication for 1 files
---->8---->8---->8---->8---->8---->8----

I don't understand why introducing an 'else if' clause is causing the
semantic patch to skip over the function.

Anybody knows what's happenig and how to fix it?

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

Reply via email to