exponenta event banner

Отсутствует значение null в строковом массиве

Строка не заканчивается нулевым символом

Описание

Этот дефект возникает, когда в строке недостаточно места для завершения с нулевым символом '\0'.

Этот дефект относится только к проектам в C.

Риск

Переполнение буфера может произойти при копировании строки в массив без использования неявного пустого терминатора.

Зафиксировать

При инициализации символьного массива с литералом не указывайте границы массива.

char three[]  = "THREE";
Компилятор автоматически выделяет место для пустого терминатора. В предыдущем примере компилятор выделяет достаточное пространство для пяти символов и нулевого признака конца.

Если проблема возникает после инициализации, возможно, потребуется увеличить размер массива на единицу для учета пустого терминатора.

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

Примеры

развернуть все

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[5] = "THREE";
}

Символьный массив three имеет размер от 5 до 5 символов 'T', 'H', 'R', 'E', и 'E'. Нет места для нулевого символа в конце, поскольку three имеет размер всего пять байт.

Исправление - увеличение размера массива

Одной из возможных корректировок является изменение размера массива для пяти символов плюс нулевой символ.

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[6] = "THREE";
}
Исправление - изменение метода инициализации

Одной из возможных корректировок является инициализация строки, оставляя пустой размер массива. Этот метод инициализации обеспечивает выделение достаточного объема памяти для пяти символов и символа terminating-null.

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[]  = "THREE";
}

Информация о результатах

Группа: Программирование
Язык: C
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: MISSING_NULL_CHAR
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 170
Представлен в R2013b