exponenta event banner

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

Манипуляция памятью с жестко закодированным размером вместо sizeof

Описание

Этот дефект возникает в константах, которые являются аргументами размера памяти для функций памяти, таких как malloc или memset.

Риск

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

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

Для аргумента размера функций памяти используйте sizeof(object).

Примеры

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

#include <stddef.h>
#include <stdlib.h>
enum {
    SIZE3   = 3,
    SIZE20  = 20
};
extern void fill_ints(int **matrix, size_t nb, size_t s);

void bug_hardcodedmemsize()
{
    size_t i, s;

    s = 4;
    int **matrix = (int **)calloc(SIZE20, s);
    if (matrix == NULL) {
        return; /* Indicate calloc() failure */
    }
    fill_ints(matrix, SIZE20, s);
    free(matrix);
}

В этом примере функция выделения памяти calloc вызывается с размером памяти 4. Память выделяется целочисленному указателю, размер которого может быть больше или меньше 4 байт в зависимости от цели. Если целочисленный указатель не равен 4 байтам, программа может завершиться ошибкой.

Коррекция - использование sizeof(int *)

При звонке calloc, замените жестко закодированный размер на вызов sizeof. Это изменение делает код более портативным.

#include <stddef.h>
#include <stdlib.h>
enum {
    SIZE3   = 3,
    SIZE20  = 20
};
extern void fill_ints(int **matrix, size_t nb, size_t s);

void corrected_hardcodedmemsize()
{
    size_t i, s;

    s = sizeof(int *);
    int **matrix = (int **)calloc(SIZE20, s);
    if (matrix == NULL) {
        return; /* Indicate calloc() failure */
    }
    fill_ints(matrix, SIZE20, s);
    free(matrix);
}

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

Группа «Надлежащая практика»
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: HARD_CODED_MEM_SIZE
Воздействие: Низкий
CWE ID: 805
Представлен в R2016b