Ecco come strtol
deve essere dichiarato in base alle § 7.22.1.4
da C11 (n1570):argomenti aliasing in strtol
#include <stdlib.h>
long int strtol (const char *restrict nptr,
char **restrict endptr,
int base);
Per quanto ne so, la parola chiave restrict
significa che l'oggetto a cui fa riferimento il lvalue *nptr
sarà accessibile solo con esso o un valore direttamente derivato da esso.
Tuttavia, un sacco di programmatori, e anche quelli con esperienza, usano strtol
nel seguente modo:
#include <stdlib.h>
strtol (p, &p, 10);
In tal caso, **endptr == **&p == *p == *nptr
, e il comportamento è indefinito. È giusto?
Un po 'di tempo fa ho scritto un post sul tema che "restrict" è frustrante come un elemento di specifica perché fa implicitamente riferimento all'implementazione. Se un'implementazione di 'strtol()' accede sia a '** endptr' che a' * nptr', allora non è definito per passare 'p' e' & p' ad esso. In caso contrario, non è indefinito passare questi argomenti. La specifica implicita da 'restrict' ha senso solo rispetto alla stessa implementazione che dovrebbe essere nascosta dalla specifica. http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular –