具体例1: malloc で確保したアドレス以外で free しようとしてのエラー
レポート結果
ログからわかること
・対象のプロセスIDは 38449
・スレッドT0(メインスレッド) の アドレス 0x619000000581 において、attempting free on address which was not malloc()-ed を検出した
・test71.cpp の 8行目から呼び出された free で発生(※コンパイラが自動的に freeの代わりに wrap_freeを呼び出す処理に書き換えていた)
・アドレス 0x619000000581 は、1024バイト分確保された 0x619000000580(以降) 〜 0x619000000980(未満) の範囲内
・1024バイトのバッファはtest71.cppの6行目にあるmallocでスレッドT0によって確保された(※コンパイラが自動的に malloc の代わりに wrap_malloc を呼び出す処理に書き換えていた)
【ログから推測できる不具合の内容】
・先頭アドレスの計算を間違えている(オフセット計算)
・malloc 以外で確保したアドレスを free しようとした
参考)上記のログを発生させたソースコード
#include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // ヒープ確保 char *ptr = (char *) malloc(1024); // ヒープ解放 free(ptr + 1); return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test71 -fsanitize=address test71.cpp $ ./test71
具体例2: newで確保したアドレス以外で delete しようとしてエラー
レポート結果
ログからわかること
・対象のプロセスIDは 38537
・スレッドT0(メインスレッド) の アドレス 0x619000000581 において、attempting free on address which was not malloc()-ed を検出した
・test72.cpp の 8行目から呼び出された delete で発生(※コンパイラが自動的に deleteの代わりに wrap__ZdaPvを呼び出す処理に書き換えていた)
・アドレス 0x619000000581 は、1024バイト分確保された 0x619000000580(以降) 〜 0x619000000980(未満) の範囲内
・1024バイトのバッファはtest72.cppの6行目にあるnewでスレッドT0によって確保された(※コンパイラが自動的に new の代わりに wrap__ZdaPv を呼び出す処理に書き換えていた)
【ログから推測できる不具合の内容】
・先頭アドレスの計算を間違えている(オフセット計算)
・new 以外で確保したアドレスを delete しようとした
参考)上記のログを発生させたソースコード
#include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // ヒープ確保 char *ptr = new char[1024]; // ヒープ解放 delete [] (ptr + 1); return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test72 -fsanitize=address test72.cpp $ ./test72