exponenta event banner

Неверный тип, используемый в 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 из пяти стрелочных указателей. Однако 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++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: PTR_SIZEOF_MISMATCH
Воздействие: Высокое
CWE ID: 467
Представлен в R2013b