strlen не проверяется на NULL - PullRequest
       18

strlen не проверяется на NULL

25 голосов
/ 27 апреля 2011

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

, если я сделаю strlen(NULL), сегментация программы не будет работать.

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

Ответы [ 6 ]

29 голосов
/ 27 апреля 2011

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

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

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

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }
19 голосов
/ 27 апреля 2011

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

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

5 голосов
/ 02 января 2014

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

#define strlens(s) (s==NULL?0:strlen(s))
5 голосов
/ 27 апреля 2011

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

3 голосов
/ 27 апреля 2011
size_t strlen ( const char * str );

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

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

2 голосов
/ 27 апреля 2011

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

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

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

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

...