Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

C/C++, strlen(NULL)

#c #null #strlen


Почему эта функция не проверяет переданный ей аргумент на NULL? 

Самое интересное, что мало где пишут, что strlen(NULL) приводит к сегфолту. Даже
в книжке С.Прата за 2015 год нет ни слова о том, что функция не выполняет названную
проверку. Очень странно.
    


Ответы

Ответ 1



На самом деле ничего странного в этом нет. Средства стандартных библиотек C и C++ часто не используют дополнительных проверок корректности аргументов в угоду эффективности. Многие средства уже предполагают, что программист сделал проверку, либо она вовсе не нужна, т.к. есть какая-то гарантия валидности аргумента. Если же сделать проверку внутри функций, то получим потерю производительности из-за лишних проверок. Возьмем простой пример: if (str) {//Проверка на ноль size = strlen(str);//А внутри strlen была бы еще одна проверка } else { printf("error\n"); } Тоже самое можно отнести, например, к std::vector::operator[]: for(size_type i = 0; i < vec.size(); ++i) { //Мы не выйдем за пределы вектора vec[i] = i;//Но в operator[] всё равно была бы еще одна проверка } И если с вектором всё более менее понятно - есть отдельная функция-член at, проверяющая валидности индекса, то с strlen чуть сложнее. Что должна вернуть эта функция, если ей передали NULL? Нужна была бы какая-то константа для определения факта ошибки и опять же, дополнительные проверки. К слову о том, что об этом нигде не пишут. На самом деле - пишут. Например, на cppreference: https://en.cppreference.com/w/cpp/string/byte/strlen Parameters str - pointer to the null-terminated byte string to be examined Аргументом strlen должен быть указатель на null-terminated byte string, коим NULL не является. Но можно обратиться и к стандарту C. Для strlen никаких требования не указано, поэтому согласно Вырезка из документа N1570 7.24.1 String function conventions ... Unless explicitly stated otherwise in the description of a particular function in this subclause, pointer arguments on such a call shall still have valid values, as described in 7.1.4. аргумент должен иметь валидное значение, согласно описанному в 7.1.4: 7.1.4 Use of library functions Each of the following statements applies unless explicitly stated otherwise in the detailed descriptions that follow: If an argument to a function has an invalid value (such as a value outside the domain of the function, or a pointer outside the address space of the program, or a null pointer, or a pointer to non-modifiable storage when the corresponding parameter is not const-qualified) or a type (after promotion) not expected by a function with variable number of arguments, the behavior is undefined а согласно этому пункту, как видим, передача нулевого указателя приводит к неопределенному поведению.

Комментариев нет:

Отправить комментарий