exponenta event banner

Динамическое выделение памяти без резервирования

Указатель, возвращенный из динамического выделения, не проверен NULL или nullptr стоимость

Описание

Этот дефект возникает при доступе к динамически выделенной памяти без предварительной проверки успешности предыдущего выделения памяти.

Риск

При динамическом выделении памяти с помощью malloc, calloc, или realloc, возвращает значение NULL если запрошенная память недоступна. Если код, следующий за выделением, обращается к блоку памяти без проверки NULL значение, этот доступ не защищен от сбоев.

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

Проверьте возвращаемое значение malloc, calloc, или realloc для NULL перед доступом к выделенной ячейке памяти.

int *ptr = malloc(size * sizeof(int));

if(ptr) /* Check for NULL */ 
{
   /* Memory access through ptr */
}

Примеры

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

#include <stdlib.h>

void Assign_Value(void) 
{
  int* p = (int*)calloc(5, sizeof(int));

  *p = 2;  
  /* Defect: p is not checked for NULL value */

  free(p);
}

Если выделение памяти завершается неуспешно, функция calloc прибыль NULL кому p. Перед доступом к памяти через p, код не проверяет, p является NULL

Исправление - проверка значения NULL

Одной из возможных корректировок является проверка p имеет значение NULL перед исключением.

#include <stdlib.h>

void Assign_Value(void)
 {
   int* p = (int*)calloc(5, sizeof(int));

   /* Fix: Check if p is NULL */
   if(p!=NULL) *p = 2; 

   free(p);
 }
#include <stdlib.h>
#include<string.h>
typedef struct recordType {
    const char* id;
    const char* data;
} RECORD;

RECORD* MakerecordType(const char *id,unsigned int size){
    RECORD *rec = (RECORD *)calloc(1, sizeof(RECORD));
    rec->id = strdup(id);

    const char *newData = (char *)calloc(1, size);
    rec->data = newData;
    return rec;
}

В этом примере средство проверки вызывает дефект при отмене привязки указателя rec без проверки наличия NULL значение из предыдущего динамического выделения памяти.

Аналогичная проблема возникает с указателем newData. Однако дефект не поднимается, так как указатель не удаляется, а просто копируется в rec->data. Простое копирование над, возможно, нулевым указателем не является проблемой само по себе. Например, вызывающие абоненты recordType_new функция может проверять для NULL значение rec->data перед деэреференцией, тем самым избегая нулевой деэрекции указателя.

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

Группа: Динамическая память
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: UNPROTECTED_MEMORY_ALLOCATION
Воздействие: Низкий
CWE ID: 253, 690, 789
Представлен в R2013b