> On Aug 4, 2023, at 10:42 AM, Siddhesh Poyarekar <siddh...@gotplt.org> wrote: > > On 2023-08-04 10:40, Siddhesh Poyarekar wrote: >> On 2023-08-03 13:34, Qing Zhao wrote: >>> One thing I need to point out first is, currently, even for regular fixed >>> size array in the structure, >>> We have this same issue, for example: >>> >>> #define LENGTH 10 >>> >>> struct fix { >>> size_t foo; >>> int array[LENGTH]; >>> }; >>> >>> … >>> int main () >>> { >>> struct fix *p; >>> p = alloc_buf_more (); >>> >>> expect(__builtin_object_size(p->array, 1), LENGTH * sizeof(int)); >>> expect(__builtin_object_size(p->array, 0), -1); >>> } >>> >>> Currently, for __builtin_object_size(p->array, 0), GCC return UNKNOWN for >>> it. >>> This is not a special issue for flexible array member. >> That's fine for fixed arrays at the end of a struct because the "whole >> object" size could be anything; `p` could be pointing to the beginning of an >> array for all we know. If however `array` is strictly a flex array, i.e.: >> ``` >> struct A >> { >> size_t foo; >> int array[]; >> }; >> ``` >> then there's no way in valid C to have an array of `struct fix`, so `q` must >> be pointing to a single element. So you could deduce: >> 1. the minimum size of the whole object that q points to. > > Actually for minimum size we'd also need a guarantee that `alloc_buf_more` > returns a valid allocated object.
Why? Please explain a little bit here. thanks. Qing > > Sid