CERT C: Rec. DCL06-C

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

Описание

Управляйте определением

Используйте значимые символьные константы, чтобы представлять литеральные значения. [1]

Примеры

развернуть все

Описание

Трудно закодированный buffer size происходит, когда вы используете численное значение вместо символьной константы при объявлении буфера памяти, такого как массив.

Риск

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

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

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

Фиксация

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

Константы enum рекомендуются.

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

  • Константы enum известны во время компиляции. Поэтому компиляторы могут оптимизировать циклы более эффективно.

    const - квалифицированные переменные обычно известны во время выполнения.

Пример - трудно закодированный Buffer Size

int table[100];

void read(int);

void func(void) {
    for (int i=0; i<100; i++)
        read(table[i]);
}

В этом примере размере массива трудно закодирован table.

Исправление — использует символьное имя

Одно возможное исправление должно заменить трудно закодированный размер на символьное имя.

const int MAX_1 = 100;        
#define MAX_2 100
enum { MAX_3 = 100 };

int table_1[MAX_1];
int table_2[MAX_2];
int table_3[MAX_3];

void read(int);

void func(void) {
    for (int i=0; i < MAX_1; i++)
        read(table_1[i]);
    for (int i=0; i < MAX_2; i++)
        read(table_2[i]);
    for (int i=0; i < MAX_3; i++)
        read(table_3[i]);
}

Описание

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

Проверяйте информацию

Группа: Rec. 02. Объявления и инициализация (DCL)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.