Hard-coded object size used to manipulate memory

Манипуляции с памятью с жестко закодированным размером вместо 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++
По умолчанию: Off
Синтаксис командной строки: HARD_CODED_MEM_SIZE
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 805
Введенный в R2016b