根据C11(n1570)的§7.22.1.4,下面是如何声明strtol
的:
#include <stdlib.h>
long int strtol (const char *restrict nptr,
char **restrict endptr,
int base);
据我所知,
restrict
关键字意味着由左值 *nptr
引用的对象只能使用它或直接派生自它的值进行访问。然而,很多程序员,甚至是有经验的程序员,会以以下方式使用
strtol
:#include <stdlib.h>
strtol (p, &p, 10);
在这种情况下,
**endptr == **&p == *p == *nptr
,行为是未定义的。对吗?
strtol()
实现同时访问**endptr
和*nptr
,那么将p
和&p
传递给它是未定义的。如果没有,则传递这些参数是没有问题的。由“restrict”所暗示的规范只有在与应该被规范隐藏的实现相关时才有意义。http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular - Pascal Cuoq