Unprotected dynamic memory allocation

Указатель, возвращенный из динамического распределения, не проверен на 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++
По умолчанию: Off
Синтаксис командной строки: UNPROTECTED_MEMORY_ALLOCATION
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 253, 690, 789
Введенный в R2013b