exponenta event banner

Жестко закодированный размер буфера

Размер буфера памяти - это числовое значение вместо символьной константы

Описание

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

Риск

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

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

  • Жесткие константы могут подвергаться атаке, если раскрыт код.

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

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

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

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

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

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

Примеры

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

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]);
}

Информация о результатах

Группа: Надлежащая практика
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: HARD_CODED_BUFFER_SIZE
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 547
Представлен в R2015b