メインコンテンツ

ISO/IEC TS 17961 [xfree]

Reallocating or freeing memory that was not dynamically allocated

説明

ルール定義

動的に割り当てられていないメモリの再割り当てまたは解放。1

Polyspace 実装

このチェッカーは、ポインターの無効な解放をチェックします。

すべて展開する

問題

ポインターの無効な解放は、関数 free を使用して解放されたメモリのブロックが、以前に malloccalloc または realloc を使用して割り当てられていなかった場合に発生します。

リスク

関数 free はヒープに割り当てられたメモリのブロックを解放します。以前に割り当てていないヒープ上の位置にアクセスしようとすると、セグメンテーション違反が発生する可能性があります。

この問題により、コーディング エラーが強調表示される場合があります。たとえば、関数 free または前の関数 malloc を別のポインターに対して使用する必要があった可能性があります。

修正方法

ほとんどの場合、free ステートメントを削除することによって問題を修正できます。malloc または calloc を使用してポインターにヒープのメモリが割り当てられていない場合、このポインターを解放する必要はありません。単に必要に応じてポインターを再利用できます。

この問題によって、間違ったポインターに対して free または malloc を使用するなどのコーディング エラーが明らかになった場合は、そのエラーを修正します。

new 演算子で割り当てられたメモリを解放するために関数 free を使用したことが原因で問題が発生している場合は、関数 freedelete 演算子に置き換えます。

例 - ポインターの無効な解放エラー
#include <stdlib.h>

void Assign_Ones(void) 
{
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1; 
 
  free(p);   
  /* Defect: p does not point to dynamically allocated memory */
}

ポインター p は、関数 free を使用して割り当て解除されています。しかし、p は動的に割り当てられていないメモリの場所を指しています。

修正 — ポインターの割り当て解除を削除

配列 p の要素数がコンパイル時にわかっている場合、1 つの修正方法として、ポインター p の割り当て解除を削除することができます。

#include <stdlib.h>

void Assign_Ones(void)
 {
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1;   
  /* Fix: Remove deallocation of p */
 }
修正 — ポインターを割り当てる

配列 p の要素数がコンパイル時にわかっていない場合、1 つの修正方法として、配列 p に動的にメモリを割り当てることができます。

#include <stdlib.h>

void Assign_Ones(int num) 
{
  int *p;
  /* Fix: Allocate memory dynamically to p */
  p=(int*) calloc(10,sizeof(int)); 
  for(int i=0;i<10;i++)
     *(p+i)=1; 
  free(p); 
}

チェック情報

決定可能性:決定不可能

バージョン履歴

R2019a で導入


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.