Wrong type used in sizeof

sizeof аргумент не совпадает с указанным типом

Описание

Этот дефект возникает, когда оба из следующих условий удерживаются:

  • Вы присваиваете адрес блока памяти указателю, или передаете данные между двумя блоками памяти. Назначение или копия использует sizeof оператор.

    Например, вы инициализируете указатель, используя malloc (sizeof (type)) или скопируйте данные между двумя адресами с помощью memcpy (destination_ptr, source_ptr, sizeof (type)).

  • Вы используете неправильный тип в качестве аргумента sizeof оператор. Вы используете тип указателя вместо типа, на который указывает указатель мыши.

    Например, чтобы инициализировать type* указатель, вы используете malloc (sizeof (type*)) вместо malloc (sizeof (type)).

Риск

Независимо от того, что type означает, выражение sizeof (type*) всегда возвращает фиксированный размер. Возвращенный размер - это размер указателя на вашей платформе в байтах. Внешний вид sizeof (type*) часто указывает на непреднамеренное использование. Ошибка может вызвать выделение блока памяти, которое намного меньше, чем вам нужно, и привести к недостаткам, таким как переполнение буфера.

Например, предположим, что structType - структура с десятью int переменные. Если вы инициализируете structType* указатель с использованием malloc(sizeof(structType*)) на 32-битной платформе указателю присваивается блок памяти в четыре байта. Однако будет полностью выделено на одну structType переменная, structType* указатель должен указывать на блок памяти sizeof(structType) = 10 * sizeof(int) байты. Необходимый размер намного больше фактического выделенного размера в четыре байта.

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

Как инициализировать type* указатель, замените sizeof (type*) в выражении инициализации указателя с sizeof (type).

Примеры

расширить все

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char*) * 5);
    free(str);

}

В этом примере память выделяется для символьного указателя str использование malloc из пяти указателей char. Однако str - указатель на символ, а не указатель на символьный указатель. Поэтому sizeof аргумент, char*, неправильный.

Коррекция - соответствие типа указателя на sizeof Аргумент

Одной из возможных коррекций является соответствие аргумента типу указателя. В этом примере str является символьным указателем, поэтому аргумент должен также быть символом.

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char) * 5);
    free(str);

}

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

Группа: Программирование
Язык: C | C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: PTR_SIZEOF_MISMATCH
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 467
Введенный в R2013b