Hard-coded loop boundary

Граница цикла является числовым значением вместо символьной константы

Описание

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

Риск

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

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

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

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

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

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

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

  • 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++
По умолчанию: Off
Синтаксис командной строки: HARD_CODED_LOOP_BOUNDARY
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 547
Введенный в R2015b