Hier ist, wie strtol
erklärt werden muss nach § 7.22.1.4
von C11 (n1570):Aliased Argumente in strtol
#include <stdlib.h>
long int strtol (const char *restrict nptr,
char **restrict endptr,
int base);
Soweit ich weiß, das restrict
Schlüsselwort bedeutet, dass die von der L-Wert referenzierte Objekt *nptr
wird nur mit ihm oder einem direkt davon abgeleiteten Wert zugegriffen werden.
jedoch viele Programmierer und Erfahrenen selbst, verwenden strtol
auf folgende Weise:
#include <stdlib.h>
strtol (p, &p, 10);
In diesem Fall **endptr == **&p == *p == *nptr
und das Verhalten ist nicht definiert. Ist es richtig?
Vor einiger Zeit schrieb ich einen Blogbeitrag zu dem Thema, dass 'restrict' frustrierend ist als ein Element der Spezifikation, weil es sich implizit auf die Implementierung bezieht. Wenn eine 'strtol()' - Implementierung sowohl auf '** endptr' als auch auf '* nptr' zugreift, ist es undefiniert, 'p' und '& p' daran zu übergeben. Ist dies nicht der Fall, ist es nicht undefiniert, diese Argumente zu übergeben. Die von "restrict" implizierte Spezifikation macht nur in Bezug auf die Implementierung Sinn, die durch die Spezifikation verborgen werden sollte. http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular –