■この記事の概要
この記事では、C言語におけるダングリングポインタ(解放済みメモリや終了した自動変数を指すポインタ)について説明し、その危険性と発見方法を紹介しています。
具体的なコード例と、clang
ツールを使った分析方法が掲載されています。
■ダングリングポインタとは
「宙ぶらりんのポインタ」と和訳され
不正なメモリ領域を指すポインタの事です。
いまいち筆者にはピンと来ない訳なので
「梯子を外されたポインタ」と意訳したい。
ここではダングリングポインタの
次の2種類を紹介します。
(1)解放済みメモリ領域を指すポインタ
(2)終了した自動変数領域を指すポインタ
■解放済みメモリ領域を指すダングリングポインタ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *cp = malloc(128);
if(cp == NULL){
perror(NULL);
exit(1);
}
strcpy(cp,"確保したメモリを使う");
puts(cp);
free(cp);//解放する
//解放した領域を指すダングリングポインタ
puts(cp);//Dangling Pointer
}
13行目で解放済みのcpを再度使用しています。
➡見つけ方
clang --analyze -O2 f1.c
f1.c:16:5: warning: Use of memory after it is freed [unix.Malloc]
puts(cp);//Dangling Pointer
■終了した自動変数領域を指すダングリングポインタ
#include <stdio.h>
char *fullpath(char *path,char *file){
char buf[128];
char *ptr = buf;
sprintf(ptr,"/%s/%s",path,file);
//自動変数終了後使用
return ptr;//Dangling Pointer
}
int main(void){
printf("%s\n",fullpath("root",__FILE__));
}
9行目で関数が終了した瞬間,
配列bufの寿命が終了するので
ptrはダングリングポインタとなります。
➡見つけ方
clang --analyze -O2 f2.c
f2.c:9:5: warning: Address of stack memory associated with local variable 'buf' returned to caller [core.StackAddressEscape]
return ptr;//Dangling Pointer
上記の問題は以下のオプションで検出できます。
clang –analyze
ハイフォンは2個なので注意してください。
参考: