Что происходит, когда вы даете пустую строку стандартной функции Си? - PullRequest
2 голосов
/ 30 ноября 2011

В стандартной библиотеке C имеется множество функций-строк, например (в string.h)

char *strcat(char *str1, const char *str2);

или (в stdlib.h)

long int strtol(const char *nptr, char **endptr, int base);

(игнорироватьмудрость вызова этих функций для целей этого вопроса.)

Что произойдет, если я передам любую из этих функций NULL указатель?(Я имею в виду (char *) 0, а не пустую строку.)

Я не нашел ответов на справочных страницах или в Интернете.

Это заставляет меня думать, что это определяется реализацией, но это также может означать ошибку автоматической сегментации;специальное поведение ошибки или возвращаемые значения также не указываются.

Может ли поведение даже варьироваться от функции к функции в рамках одной и той же реализации?

Ответы [ 5 ]

7 голосов
/ 30 ноября 2011

Стандарт C говорит об этом в 7.21.1 Соглашения о строковых функциях, пункт 2 :

Если в описании конкретной функции в этом подпункте не указано иноеаргументы для такого вызова все еще должны иметь допустимые значения, как описано в 7.1.4.

7.1.4 Использование библиотечных функций :

Если аргумент функции имеет недопустимое значение (например, значение вне домена функции, или указатель вне адресного пространства программы, или нулевой указатель, или указатель на неизменяемое хранилище при соответствующем параметрене является константно-квалифицированным) или тип (после повышения) не ожидается функцией с переменным числом аргументов, поведение не определено.

strcat() описание в 7.21.3.1 ничего не говорит о том, что указатель NULL является допустимым вводом, поэтому я заключаю, что поведение официально не определено, если любой из его указателей ввода равен NULL.

2 голосов
/ 30 ноября 2011

Если не указано, что функция делает со значениями NULL (например, endptr определяется как NULL), то результат будет неопределенным - крах, код ошибки, прерывание или демон из вашего носа.

2 голосов
/ 30 ноября 2011

Стандарт ничего не говорит, так что это неопределенное поведение.На многих платформах вы получите ошибку сегмента, потому что она будет разыменовывать нулевой указатель.

0 голосов
/ 30 ноября 2011

Это будет зависеть от реализации.Но вы будете получать segfaults во многих реализациях.Так как строковая функция широко используется, эти библиотечные функции обычно не выполняют проверку нуля.(должно быть потому, что для эффективности)

РЕДАКТИРОВАТЬ: Как упоминалось @Alex, это не зависит от реализации;это не определено.

0 голосов
/ 30 ноября 2011

В спецификации C не упоминается, что произойдет, если вы передадите ошибочные аргументы, например, strcat и подобным функциям, поэтому она полностью зависит от реализации.Но я бы поспорил, что не так много реализаций проверяют, по крайней мере, параметры NULL в сборках релиза.

...