On Tue, Jul 09, 2024 at 12:28:18PM GMT, Alejandro Colomar wrote: > Hi Jakub, > > On Tue, Jul 09, 2024 at 11:18:11AM GMT, Jakub Jelinek wrote: > > On Tue, Jul 09, 2024 at 11:07:59AM +0200, Alejandro Colomar wrote: > > > Yup, I was thinking that maybe noalias is a better name. > > > > Name is one thing, but you'd also need to clearly define what it means. > > When restrict is access based, it is clear what it means. > > > > If you want something else which is not based on accesses and which should > > allow warnings in the callers, I suppose you need to specify not just the > > pointer but the extent as well (and maybe stride) or that it is an '\0' > > Agree. Here's how I'd define it as an attribute: > > noalias > > The noalias function attribute specifies that the pointer to > which it applies is the only reference to the array object that > it points to (except that a pointer to one past the last > element may overlap another object). > > If the number of elements is specified with array notation, the > array object to be considered is a subobject of the original > array object, which is limited to the number of elements > specified in the function prototype. > > Example: > > [[alx::noalias(1)]] [[alx::noalias(2)]] > [[gnu::access(read_write, 1)]] [[gnu::access(read_only, 2)]] > void add_inplace(int a[n], const int b[n], size_t n); Ooops, I meant 'n' to be the first parameter. > > char arr[100] = ...; > > add_inplace(arr, arr + 50, 50); > > In the example above, the parameters a and b don't alias inside > the function, since the subobjects of 50 elements do not overlap > eachother, even though they are one single array object to the > outer function. > > It may need some adjustment, to avoid conflicts with other parts of > ISO C, but this is the idea I have in mind. > > > terminated string, because if you want to say that for > > void foo (char *, const char *, int); > > the 2 pointers don't really alias, the size information is missing. So, > > shall the new warning warn on > > struct S { char a[1024]; char b[1024]; } s; > > foo (s.a, s.b, 512); > > This does not need clarification of bounds. You're passing separate > objects, and thus cannot alias (except that maybe you're able to cast > to the struct type, and then access s.b from a pointer derived from > s.a; I never know that rule too well). > > > or not? Or foo (s.a, s.a + 512, 512); > > According to the definition I provide in this email, the above is just > fine. > > Thanks! > > Have a lovely day! > Alex > > > > > Jakub > > > > > > -- > <https://www.alejandro-colomar.es/> -- <https://www.alejandro-colomar.es/>
Attachment:
signature.asc
Description: PGP signature