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 isNull

Коррекция — проверяет на нулевое значение

Одна возможная коррекция должна проверять ли 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
Удар: низко
ID CWE: 253, 690, 789
Введенный в R2013b