Hard-coded loop boundary

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

Описание

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