Незащищенное динамическое выделение памяти

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

Описание

Незащищенное динамическое выделение памяти происходит, когда вы не проверяете после динамического выделения памяти ли выделение памяти, за которым следуют.

Риск

Когда память динамически выделяется с помощью 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

Исправление — проверяет на нулевое значение

Одно возможное исправление должно проверять, имеет ли 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);
 }

Проверяйте информацию

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

Введенный в R2013b