On Fri, Dec 07, 2018 at 02:52:48PM +0000, Wilco Dijkstra wrote:
> -  struct __attribute__((aligned (32))) S { int a[4]; } s;                    
>                                                                      
> -  bar (&s);                                                                  
>                                                                      

Any reason to remove the above?

>    p = __builtin_alloca (x);
> +  q = __builtin_alloca (x);
>    if (!__builtin_setjmp (buf))
>      broken_longjmp (buf);
>  
> +  /* Compute expected next alloca offset - some targets don't align properly
> +     and allocate too much.  */
> +  p = q + (q - p);

This is UB, pointer difference is only defined within the same object.
So, you can only do such subtraction in some integral type rather than as
pointer subtraction. 

> +
>    /* Fails if stack pointer corrupted.  */
> -  q = __builtin_alloca (x);
> -  if (foo (p) < foo (q))
> -    {
> -      if (foo (q) - foo (p) >= 1024)
> -     abort ();
> -    }
> -  else if (foo (p) - foo (q) >= 1024)
> +  if (p != __builtin_alloca (x))

And I'm not sure you have a guarantee that every zero sized alloca is at the
same offset from the previous one.

        Jakub

Reply via email to