On Sat, 2024-07-06 at 10:24 +0800, Xi Ruoyao wrote: > On Sat, 2024-07-06 at 00:02 +0200, Alejandro Colomar wrote: > > That's precisely the case with strtol(3): it doesn't access any objects > > through *endptr, and so that pointer need not be restrict. > > > > Then, nptr is a read-only pointer, so is doesn't matter either if it's > > accessed or not. > > Restrict allows to reorder any writes to other objects with an read from > nptr then. In strtol at least errno can be written, and depending on the > implementation of locale things there may be more. > > TBAA does not help here because char aliases with anything. Also in the implementation of strtol if it passes nptr to another auxiliary function and that function does not have some fancy const or access attributes, the compiler will assume that function may write into the buffer pointed by nptr because in C you can actually write via a const T * unless it really points to a const T (not non-qualified T). BTW among your list: > > [[gnu::access(read_only, 1)]] > > [[gnu::access(write_only, 2)]] > > [[gnu::leaf]] > > [[gnu::nothrow]] > > [[gnu::null_terminated_string_arg(1)]] IMO we should add these access attributes, they'll definitely help the optimization (like, optimize away the initialization of a pointer). We already have __THROW which expands to nothrow and leaf. I'm not sure if null_terminated_string_arg is correct: is the following invalid or not? char p[] = {'1', ')'}; char *q; strtol(p, &q, 10); assert(q == &p[1]); If this is invalid we should have null_terminated_string_arg so at least we'll get a warning against this. -- Xi Ruoyao <xry111@xxxxxxxxxxx> School of Aerospace Science and Technology, Xidian University