Трудно закодированный контур цикла

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

Описание

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

Риск

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

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

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

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

Фиксация

Используйте символьное имя вместо трудно закодированного постоянного контура цикла for. Символьные имена включают 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
Влияние: низко
ID CWE: 547

Введенный в R2015b