Thanks for all the explanations.

Richard Henderson wrote:
> 
> In the case of the (fake) flexible array member, you do not know
> how large the object allocated from malloc was unless you can
> track down the actual malloc call.
> 

Gabriel Dos Reis wrote:
>      typedef struct {
>         int data[1];
>      } foo;
> 
>      foo* p = (foo *) malloc (sizeof (foo) + N * sizeof (int));
>      // there are enough room for N ints, and the store is properly
>      // aligned.
> 
>      for (int i = 0; i < N; ++i)
>            p->data[i] = frobnicate (N, i);


Is the following still correct?  (accessing elements of before_end
that will dynamically be allocated)

     typedef struct {
        int before_end[5];
        int bar;
        int data[1];
     } foo;

     foo* p = (foo *) malloc (sizeof (foo) + N * sizeof (int));
     // there are enough room for N ints, and the store is properly
     // aligned.

     for (int i = 0; i < N + 6; ++i)
           p->before_end[i] = frobnicate (N, i);


If this is still correct, I will just restrict the analyzer to not
infer any property from data defined in structs.

If accessing "p->bar" via "p->before_end[5]" is not correct, I can
restrict the analyzer to work only on "non last array in a struct".

Reply via email to