CERT C: Rec. DCL06-C

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

Описание

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

Используйте значимые символьные константы, чтобы представлять литерал values.[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в то время как или 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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