具体例1: すでにfree済みのアドレスをさらにfreeしようとしてエラー
レポート結果
ログからわかること
・対象のプロセスIDは 27956
・スレッド T0 (メインスレッドの事)において、アドレス 0x619000000580 に対する、attempting double-free を検出した
・test51.cpp の 11行目から呼び出された free で発生(※コンパイラが自動的に freeの代わりに wrap_free を呼び出す処理に書き換えていた)
・アドレス 0x619000000580 は、0x619000000580 から始まる 1024バイトの領域の先頭である。
・test51.cppの8行目で スレッドT0によって解放済
・test51.cppの5行目で 以前はスレッドT0によって確保されていた。
【ログから推測できる不具合の内容】
・二度 free しないようにシーケンスを制御し忘れている(アドレス変数をNULLに設定忘れとか。フラグ変更忘れとか。)
参考)上記のログを発生させたソースコード
#include <stdlib.h> int main(int argc, char *argv[]) { // ヒープ領域確保 void* ptr = malloc(1024); // ヒープ領域解放 free(ptr); // 同じ領域をさらに解放 free(ptr); return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test51 -fsanitize=address test51.cpp $ ./test51
具体例2: すでにdelete済みのアドレスをさらにdeleteしようとしてエラー
レポート結果
ログからわかること
・対象のプロセスIDは 28167
・スレッド T0 (メインスレッドの事)において、アドレス 0x619000000580 に対する、attempting double-free を検出した
・test52.cpp の 11行目から呼び出された delete で発生(※コンパイラが自動的に deleteの代わりに wrap__ZdaPv を呼び出す処理に書き換えていた)
・アドレス 0x619000000580 は、0x619000000580 から始まる 1024バイトの領域の先頭である。
・test52.cppの8行目で スレッドT0によって解放済
・test52.cppの5行目で 以前はスレッドT0によって確保されていた。
【ログから推測できる不具合の内容】
・二度 delete しないようにシーケンスを制御し忘れている(アドレス変数をNULLに設定忘れとか。フラグ変更忘れとか。)
参考)上記のログを発生させたソースコード
#include <stdlib.h> int main(int argc, char *argv[]) { // ヒープ領域確保 char *buffer = new char[1024]; // ヒープ領域解放 delete [] buffer; // 同じ領域をさらに解放 delete [] buffer; return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test52 -fsanitize=address test52.cpp $ ./test52