On Sun, 3 Apr 2016, Diego Nieto Cid wrote:

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

I'm not sure why it doesn't work on your example.  However it sems to work 
better like this:

@@
identifier fn;
fresh identifier canary = "canary_";
@@
 fn (...)
 {
+  int canary = 0xdeadbeef;
   <...
+  if ((canary ^ 0xdeadbeef) != 0)
+      DIVIDE_BY_ZERO;
  return ...;
  ...>
 }

This just makes the change whereever it is relevant, regardless of 
control-flow.  It seems to even work in the case of an implicit return at 
the end of the function, when the function has a void return type.

julia




> ---->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
> 
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to