exponenta event banner

CERT C: Rec. STR11-C

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

Описание

Определение правила

Не указывайте границу символьного массива, инициализированного строковым литералом. [1 ]

Внедрение Polyspace

Эта проверка проверяет отсутствие NULL в строковом массиве.

Примеры

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

Проблема

Отсутствие NULL в массиве строк возникает, когда строка не имеет достаточного места для завершения с помощью символа 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";
}

Проверить информацию

Группа: Rec. 07. Символы и строки (STR)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.