exponenta event banner

CERT C: Rec. DCL06-C

Использовать значимые символьные константы для представления буквенных значений

Описание

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

Используйте значимые символьные константы для представления буквенных значений. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие следующих проблем:

  • Жестко закодированный размер буфера.

  • Жестко закодированная граница цикла.

Примеры

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

Проблема

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

Риск

Жестко закодированный размер буфера вызывает следующие проблемы:

  • Жестко закодированный размер буфера увеличивает вероятность ошибок и, следовательно, затраты на обслуживание. Если изменение политики требует от разработчиков изменения размера буфера, они должны изменять каждое вхождение размера буфера в код.

  • Жесткие константы могут подвергаться атаке, если раскрыт код.

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

Используйте символическое имя вместо жестко закодированной константы для размера буфера. Символьные имена включают const-квалифицированные переменные, enum константы или макросы.

enum рекомендуется использовать константы.

  • Макросы заменяются их постоянными значениями после предварительной обработки. Поэтому они могут открыть границу контура.

  • enum константы известны во время компиляции. Поэтому компиляторы могут оптимизировать циклы более эффективно.

    const-квалифицированные переменные обычно известны во время выполнения.

Пример - Жестко закодированный размер буфера
int table[100];

void read(int);

void func(void) {
    for (int i=0; i<100; i++)
        read(table[i]);
}

В этом примере размер массива table и границы контура в for петли жестко закодированы.

Исправление - использовать символическое имя

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

const int MAX_1 = 100;        
#define MAX_2 100
enum { MAX_3 = 100 };

int table_2[MAX_2];
int table_3[MAX_3];

void read(int);

void func(void) {
    int table_1[MAX_1];
    for (int i=0; i < MAX_1; i++)
        read(table_1[i]);
    for (int i=0; i < MAX_2; i++)
        read(table_2[i]);
    for (int i=0; i < MAX_3; i++)
        read(table_3[i]);
}
Проблема

Жестко закодированная граница цикла возникает при использовании числового значения вместо символьной константы для границы for, while или do-while цикл.

Риск

Жестко закодированная граница контура вызывает следующие проблемы:

  • Жестко закодированная граница цикла делает код уязвимым для атак типа «отказ в обслуживании», когда цикл требует длительных вычислений или выделения ресурсов.

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

    Например, граница цикла равна 10000 и представляет максимальное количество клиентских соединений, поддерживаемых в приложении сетевого сервера. Если сервер поддерживает больше клиентов, необходимо изменить все экземпляры границы цикла в коде. Даже если граница цикла возникает один раз, необходимо искать числовое значение 10000 в вашем коде. Числовое значение может иметь место в местах, отличных от границы контура. Прежде чем найти контур контура, необходимо выполнить обзор этих мест.

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

Используйте символическое имя вместо жестко закодированной константы для границы цикла. Символьные имена включают const-квалифицированные переменные, enum константы или макросы.enum константы рекомендуется использовать по следующей причине:

  • Макросы заменяются их постоянными значениями после предварительной обработки. Поэтому они могут выставить размер буфера.

  • enum константы известны во время компиляции. Поэтому компиляторы могут выделять ресурсы хранения для них более эффективно.

    const-квалифицированные переменные обычно известны во время выполнения.

Пример - жестко закодированная граница контура
void performOperation(int);

void func(void) {
    for (int i=0; i<100; i++)
        performOperation(i);
}

В этом примере граница for цикл жестко закодирован.

Исправление - использовать символическое имя

Одной из возможных корректировок является замена жестко закодированной границы цикла символическим именем.

const int MAX_1 = 100;
#define MAX_2 100
enum { MAX_3 = 100 };

void performOperation_1(int);
void performOperation_2(int);
void performOperation_3(int);

void func(void) {
    for (int i=0; i<MAX_1; i++)
        performOperation_1(i);
    for (int i=0; i<MAX_2; i++)
        performOperation_2(i);
    for (int i=0; i<MAX_3; i++)
        performOperation_3(i);
}

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

Группа: Rec. 02. Объявления и инициализация (DCL)
Представлен в R2019a

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

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

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