2013-02-14 14 views
6

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?

+1

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 –

risposta

8

N. Nulla è accessibile tramite **endptr in strtol. Si accede solo a *endptr, un oggetto completamente separato.