<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55741>55741</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
__builtin_object_size(P->M, 1) where M is an array and the last member of a struct fails (need "-fstrict-flex-array")
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kees
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/EvehMax84
When bos1 is used on a member who is both an array and at the end of a structure, it fails to correctly resolve. This kind of behavior should only happen for flexible array members:
```C
struct middle_array {
int a;
unsigned char c[16];
int b;
};
struct trailing_array {
int a;
int b;
unsigned char c[16];
};
struct flex_array {
int a;
int b;
unsigned char c[];
};
```
Both "middle" and "trailing" should see that "c" is 16 bytes. Only "flex" should be "unbounded":
```
ok: sizeof(*middle) == 24
ok: sizeof(middle->c) == 16
ok: __builtin_object_size(middle, 1) == -1
ok: __builtin_object_size(middle->c, 1) == 16
ok: sizeof(*flex) == 8
ok: __builtin_object_size(flex, 1) == -1
ok: __builtin_object_size(flex->c, 1) == -1
ok: sizeof(*trailing) == 24
ok: sizeof(trailing->c) == 16
ok: __builtin_object_size(trailing, 1) == -1
WAT: __builtin_object_size(trailing->c, 1) == -1 (expected 16)
```
https://godbolt.org/z/s9nb4Y7q4
This is likely due to trailing all trailing arrays as historical flexible arrays, but it breaks FORTIFY_SOURCE in that any struct with a fixed size trailing array will receive no sanity checking. Please introduce something like "-fstrict-flex-array".
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVd1vmzAQ_2vg5ZQoGBLCAw_9lPZQddo6TX2KbDiCFwdntkmb_fU7Q9KSqFm7aREB-3wfvzuffxa63OW1cxsbxBcBu6VnqUuhlRtrs6TZL_rfbLG-48_zJJhcB5OL_v29xgaEthFIC63FEnQDHNa4FmjgqdZeLrSrgZPcGL6jQQncgasRkIa6In3rTFu41mDArkA6qLhUFpyGQhuDhVM7MGi12uIYHmpyuZK9qcCab6U2YGvdKh-dVGu-2RCsisSVwmcpFO5j97i6LAdJBLNJ_1z18x4NrGVZKlz0lkF62S8C_WTjgAfxQNI2Vi4bSr-ouYEimF5Gs2B6faTjrcSLJEhfV4_COkPJy2b5scDHTj8C5WxgX6v_F_RsyEOxhwgufYcEjPUlp0HXJfQ9FMOL9ltsEal5qINIVng5tUM0A7FzaMdw7xuApD6ZgZFAL2wbodumxJLG53qgn-oVrQNY-Qt1FbB5wC4O2DIIYkrnGljytm6vOArim2KgTZsw1F4sRCuVk81Cix_U4Qtv_mLsj0E0MB5Ff2G8j3zs4ST8MLG-VC-a8w-F6o3-CaU3fRPjif0Q42sfvFv-g-o_bsBrpLfBfb948PbvmZ9JkLpwjs8bMqCzQohY9odT8R4j26wRyWP684iRO3qkR8kV0lEoW_Q8eoAFXKnBxB92C9wCGTltZMHVCWVan4NonWdlYZCvLNzef3n4dPu4-Hr_7cvVDZFBfxx5s9vzODxJT_hQyWfK0hfmJCQpEAwidpRbhEaD5Y10OyIPLIjZl2P4rJBb9ERjdNkWCFav0dXeg0_MH-ZRRdFk4UZdP3V-STruqxCWeVxmccZDJ53C_Nx2ffb7dPeyT081GoQ7X7-j-8pfVopbd7jYBpfW_q4iXw1ieR4YuQ9bo06vWapUK8aFXtNEqe3hM9oY7XHSVFrbIm3D7XSaJlFY50UyjxCTeZbFgiXVLGUJnxZVPI-KhGVlFiouUNnckzBjDT5B58JjmF6HMmcTxiZTlrIoSuNsnBYiI3cM0yhO2AyDZIJrymnscfhuC03eQRLt0tKiolaxr4vcdsyPec_5IW9drU2-QrRhFzfvcP8GdOSJMw">