【C言語】
ダングリングポインタの危険性と見つけ方
(Dangling Pointer)

■この記事の概要

この記事では、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個なので注意してください。

参考:

comp.lang.c FAQlist · Question 7.5a