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.
Sid