Подтвердить что ты не робот

Является ли strncmp (NULL, "foo", 0) четко определенным?

Безопасно ли поместить указатель NULL в качестве параметра strncmp, если третий параметр равен нулю? То есть вызов вроде:

strncmp(NULL, "foo", 0);
4b9b3361

Ответ 1

Это undefined поведение.

В стандарте C указано, что вы не должны передавать недопустимые указатели на библиотечную функцию в целом.

Цитата C11, глава §7.24.1, "Соглашения о строковых функциях", (выделено мной)

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

и я не вижу никакого конкретного упоминания (как исключения для вышеупомянутого ограничения) в функции 7.24.4.4, strncmp().


Добавить контекст для "недействительных указателей", цитируя §7.1.4/p1, Использование библиотечных функций

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

и в отношении NULL, цитируя §7.19, <stddef.h>

NULL
который расширяется до константы нулевого указателя, определяемой реализацией; [...]