
warning: ‘free’ called on unallocated object ‘自動変数’
警告:自動変数の解放は未定義の動作
[-Wfree-nonheap-object]
■1.自動変数を自分で解放してはいけません
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int 自動変数 = 1024 ;
printf("%d\n",自動変数);
free(&自動変数);//★ダメ
}
自動変数は
自動的にメモリに配置され、
自動的に解放される変数のことなので、
free関数を使ってプログラマが自分で解放してはダメです。
■2.スタックはfreeで解放できません
warning: ‘free’ of ‘ptr’ which points to memory not on the heap
警告:ヒープ領域上にないメモリを指す ‘ptr’ を解放した
[-Wanalyzer-free-of-non-heap]
#include <stdlib.h>
static size_t size ;
int main(void) {
char buf[100];
char *ptr ;
if(size > 100)
ptr = malloc(size) ; //ヒープ領域
else
ptr = buf ; //スタック領域
//
// ~~~~
//
free(ptr) ; //非ヒープ領域を解放した
}
この例では size が100以下の時はヒープ領域(malloc()された領域)を指していないのに free(ptr) を実行してしまうバグです。
malloc()された領域の時のみ解放するように修正が必要です。

■3.ヒープ領域の部分解放できません
warning: ‘free’ of ‘&*p.mem1’ which points to memory not on the heap
警告:ヒープ領域上にないメモリを指す
‘&p->mem1’の解放
[-Wanalyzer-free-of-non-heap]
#include <stdlib.h>
struct tag {
int m1;
int m2;
int m3;
} ;
int main(void){
struct tag *p = malloc(sizeof(struct tag)) ;
//
//~
//
free(&(p->m1)) ; //NG部分解放
free(&(p->m2)) ; //NG途中解放
free(&(p->m3)) ; //NG同上
}
このコードでは
p->m1だけ解放したいのか、
p の指す先を全部解放したいのか、
読み手にわかりません。
malloc()した領域を一部だけ解放する事はできません。
全部解放したい場合は
free(&p->m1) ではなくて
free(p) としてください。
また、
free(&(p->m2))のように途中の解放もできません。
参考:
https://jvndb.jvn.jp/ja/cwe/CWE-590.html
https://www.jpcert.or.jp/sc-rules/c-mem34-c.html
