2013-02-14 10 views
6

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?

+1

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 –

Antwort

8

Nein. Der Zugriff erfolgt über **endptr in strtol. Nur *endptr, ein vollständig separates Objekt, wird aufgerufen.