Hi Martin, On 2023-08-09 09:26, Martin Uecker wrote: > it is a bit cumbersome to use, but one can use [static] > instead, which gives you the same static warnings. > > [static] does not work with __builtin_dynamic_object_size, > but maybe this could be changed (there is a bug filed.) > > I am not sure whether [static] should imply [[gnu::nonnull]]
I have a gripe with ISO C's [static]. As you mention, ISO conflated two functionalities in [static]: - The size of the array passed as argument must not be less than the size specified in the parameter's []. - The pointer must not be NULL. And there are valid cases where you may want the first but not the second. Or the second but not the first (that's the case for _Nonnull, of course). In fact, it's so badly damaged, that it prompted a proposal to ISO C of using [static 1] as an equivalent of _Nonnull in the prototypes that accepted a pointer that should not be NULL. However, that proposal didn't include the functions that actually take arrays as input (because they are taken in the opposite order, so array syntax is not legal). Don't you find it ironic that ISO C could have used array syntax for pointers and pointer syntax for arrays? I do. As for when one would want to mean the first (size of array) but not _Nonnull: for a function where you may pass either an array (which should not be smaller than the size), or a sentinel NULL value. Nevertheless, I floated the idea that [static] is completely unnecessary, and nobody has yet been against it. GCC could perfectly add a warning for the following case: void foo(size_t n, int a[n]); int main(void) { int a[7]; foo(42, a); } Nobody in their right mind would specify a size of an array in a parameter and expect that passing a smaller array than that can produce a valid program. So, why not make that a Wall warning? And so [static] would be irrelevant in GNU C, because well, what does it add? In fact, I like that [static] is so badly designed, because then we can repurpose plain [size] to mean the right thing, which would produce cleaner programs ([static] just adds noise to the source). What do you think of giving [42] a meaning, instead of just ignoring it? Cheers, Alex > which would then also trigger the optimization. I think > clang uses it for optimization. > > Martin -- <http://www.alejandro-colomar.es/> GPG key fingerprint: A9348594CE31283A826FBDD8D57633D441E25BB5
OpenPGP_signature
Description: OpenPGP digital signature