exponenta event banner

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

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

Описание

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