Re: [PATCH 2/3] vmsplice: make vmsplice a trivial wrapper for preadv2/pwritev2
David Laight <[email protected]>
| Newsgroups | org.kernel.vger.linux-api,dev.linux.lists.patches,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <20260605092319.5a1bba74@pumpkin> |
On Thu, 4 Jun 2026 18:57:24 -0700 Nathan Chancellor <[email protected]> wrote: > On Thu, Jun 04, 2026 at 10:32:16PM +0100, David Laight wrote: > > Talking of broken compilers, had you noticed that: > > struct foo { > > int a; > > char c[32]; > > }; > > > > int b(struct foo *f) > > { > > return __builtin_object_size(f->c, 1); > > } > > returns -1 (size unknown/indefinite). > > You can't use __builtin_object_size() to stop code running off the end > > of anything referenced by address - even when the size is constant. > > That is the entire point of using '-fstrict-flex-arrays=3' in the > kernel: > > df8fc4e934c1 ("kbuild: Enable -fstrict-flex-arrays=3") > https://godbolt.org/z/bvfrh7W58 > > Without it, all trailing arrays in structures are treated as flexible > arrays, even those with fixed sizes. > strict-flex-arrays got added in gcc 13.1 and clang 15.0; it isn't supported by the gcc 12.2 on the debian 12 system I'm building kernels on. __buitin_object_size() itself is in gcc 4.1.2 and clang 3.0. Neither are flex arrays mentioned in the gcc docs for __builtin_object_size(). Someone might have used (eg) 'char x[4]' as a flex array to include the padding, but no one would have used anything that extended the structure. And the chance of those hitting __builtin_object_size() is even smaller. -- David