Вот как strtol
должно быть объявлено в соответствии с § 7.22.1.4
из С11 (n1570):псевдонимы аргументов в strtol
#include <stdlib.h>
long int strtol (const char *restrict nptr,
char **restrict endptr,
int base);
Насколько я знаю, restrict
ключевого слова означает, что объект, на который ссылается Lvalue *nptr
будет доступ к ним только с ним или непосредственно полученное от него значение.
Однако, много программистов, и даже опытные из них, использовать strtol
следующим образом:
#include <stdlib.h>
strtol (p, &p, 10);
В этом случае, **endptr == **&p == *p == *nptr
и поведение не определено. Это правильно?
Некоторое время назад я написал сообщение в блоге на тему, что 'ограничивать 'является разочарованием как элементом спецификации, потому что он неявно ссылается на реализацию. Если реализация 'strtol()' реализует как '** endptr', так и' * nptr', то не определено передать 'p' и' & p'. Если это не так, то это не является неопределенным для передачи этих аргументов. Спецификация, подразумеваемая 'ограничивать', имеет смысл только в отношении самой реализации, которая должна быть скрыта спецификацией. http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular –