具体例: ローカル変数へのポインタを関数の戻り値で使ってしまい操作しようとしてエラー
レポート結果
ログからわかること
・対象のプロセスIDは 22691
・アドレス 0x00010c709020 において、stack-use-after-return を検出した
・PCレジスタが 0x0001087c1ecb, BPレジスタが 0x7ffee743e9e0, SPレジスタが 0x7ffee743e9d8 の状態だった
・スレッドT0(メインスレッドのこと)で発生
・4バイトの読み込みをしようとした時にアドレス0x00010c709020が違反した事を検知した
・test91.cpp の 11行目から呼び出された処理で発生
・アドレス 0x00010c709020 は スレッド T0 のこのフレームの32バイト目に位置している。
・test91.cpp の 3行目で確保されている。
・このフレームには、4行目で宣言されている’localvalue’という変数がある。
【SUMMARY 以降】
・違反になったアドレス周辺の領域はreturnで解放されたスタック領域(f5)
【ログから推測できる不具合の内容】
・関数外までローカル変数のポインタアドレスを引き回している
参考)上記のログを発生させたソースコード
#include <stdlib.h> int* func1() { int localvalue = 12; return &localvalue; } int main(int argc, char *argv[]) { int* ptr = func1(); *ptr = 0; return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test91 -fsanitize=address test91.cpp $ ASAN_OPTIONS=detect_stack_use_after_return=1 ./test91