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

Strlen не проверяет значение NULL

Почему strlen() не проверяет наличие NULL?

если я делаю strlen(NULL), это приведет к сбоям.

Попытка понять логическое обоснование (если оно есть).

4b9b3361

Ответ 1

Рациональное позади это просто - как вы можете проверить длину чего-то, чего не существует?

Кроме того, в отличие от "управляемых языков" нет ожиданий, что система времени выполнения корректно обрабатывает неверные данные или структуры данных. (Этот тип проблемы является именно тем, почему более "современные" языки более популярны для не-вычислений или менее требовательных приложений).

Стандартный шаблон в c будет выглядеть так:

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }

Ответ 2

Часть языка стандарт, который определяет состояние библиотеки обработки строк, которые, если не указано иное для конкретной функции, должны иметь любые аргументы указателя допустимые значения.

Философия, стоящая за дизайном стандартной библиотеки C, заключается в том, что программист в конечном итоге находится в лучшем положении, чтобы знать, действительно ли нужно выполнять проверку времени выполнения. В те дни, когда ваша общая системная память была измерена в килобайтах, накладные расходы на выполнение ненужной проверки времени выполнения могли быть довольно болезненными. Поэтому стандартная библиотека C не беспокоится о выполнении любой из этих проверок; он предполагает, что программист уже сделал это, если это действительно необходимо. Если вы знаете, что никогда не передадите значение плохого указателя на strlen (например, вы передаете строковый литерал или локально выделенный массив), тогда нет необходимости загромождать полученный двоичный код с ненужной проверкой против НОЛЬ.

Ответ 3

Маленький макрос, чтобы помочь вашему горе:

#define strlens(s) (s==NULL?0:strlen(s))

Ответ 4

Стандарт не требует этого, поэтому реализации просто избегают теста и потенциально дорогого перехода.

Ответ 5

size_t strlen ( const char * str );

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

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

Ответ 6

Три существенные причины:

  • Стандартная библиотека и язык C разрабатываются с учетом того, что программист знает, что делает, поэтому нулевой указатель не рассматривается как регистр, а скорее как ошибка программиста, которая приводит к undefined поведение;

  • Это приводит к чрезмерной нагрузке во время выполнения - вызов strlen тысяч раз и всегда выполнение str != NULL нецелесообразно, если программист не рассматривается как sysy;

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