CERT C: Rec. DCL06-C

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

Описание

Определение правила

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

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Жестко закодированный buffer size.

  • Цикл с жестким кодом.

Примеры

расширить все

Проблема

Жестко закодированный 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 и границу цикла в for цикл жестко закодирован.

Коррекция - Используйте символическое имя

Одной из возможных коррекций является замена жестко закодированного размера символическим именем.

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

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

void read(int);

void func(void) {
    int table_1[MAX_1];
    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 в вашем коде. Числовое значение может происходить в местах, отличных от границы цикла. Необходимо просмотреть эти места, прежде чем вы найдете границу цикла.

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

Используйте символьное имя вместо жестко закодированной константы для контура цикла. Символические имена включают 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);
}

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

Группа: Рек. 02. Объявления и инициализация (DCL)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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