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

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

Описание

Этот дефект возникает при использовании числового значения вместо символьной константы для границы 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);
}

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

Группа: Надлежащая практика
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: HARD_CODED_LOOP_BOUNDARY
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 547
Представлен в R2015b