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
Удар: низко
ID CWE: 805

Введенный в R2017b