具体例1: 前につめる時に重複
レポート結果
ログからわかること
・対象のプロセスIDは 27699
・アドレス 0x7ffee1a70520 以上 0x7ffee1a7091f 未満の範囲と、アドレス 0x7ffee1a70521以上 0x7ffee1a70920 未満の範囲 は重複したメモリ領域がある
・test41.cpp の 7行目から呼び出された memcpy で発生(※コンパイラが自動的に memcpy の代わりに __asan_memcpy を呼び出す処理に書き換えていた)
・アドレス 0x7ffee1a70520 は、test41.cppの3行目で確保された、スレッドT0におけるこのフレームのスタック領域での32バイト目にあたる
・このスレッドのこのフレームでは4行目で宣言された’buffer’という領域がオフセット32以上、1056未満の範囲で宣言されている。
・オフセット32ということは’buffer’という変数の領域内のメモリアクセスであり問題はない。
・アドレス 0x7ffee1a70521 は、test41.cppの3行目で確保された、スレッドT0におけるこのフレームのスタック領域での33バイト目にあたる
・このスレッドのこのフレームでは4行目で宣言された’buffer’という領域がオフセット32以上、1056未満の範囲で宣言されている。
・オフセット33ということは’buffer’という変数の領域内のメモリアクセスであり問題はない。
【ログから推測できる不具合の内容】
・領域が重複している時はmemcopyを使う必要があることをしらなかった(ダメという事をしらない)
・コピー元もしくはコピー先アドレスの計算に問題があり、意図せずに(結果的に)重複してしまっている
・コピーするサイズの計算に問題があり、意図せずに(結果的に)重複してしまっている
参考)上記のログを発生させたソースコード
#include <string.h> int main(int argc, char *argv[]) { char buffer[1024]; // 1バイトずつ前につめる memcpy(buffer, buffer + 1, 1023); return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test41 -fsanitize=address test41.cpp $ ./test41
具体例2: 後ろにつめる時に重複
レポート結果
ログからわかること
・対象のプロセスIDは 27869
・アドレス 0x7ffee2bca521 以上 0x7ffee2bca920 未満の範囲と、アドレス 0x7ffee2bca520以上 0x7ffee2bca91f 未満の範囲 は重複したメモリ領域がある
・test42.cpp の 7行目から呼び出された memcpy で発生(※コンパイラが自動的に memcpy の代わりに __asan_memcpy を呼び出す処理に書き換えていた)
・アドレス 0x7ffee2bca521 は、test42.cppの3行目で確保された、スレッドT0におけるこのフレームのスタック領域での33バイト目にあたる
・このスレッドのこのフレームでは4行目で宣言された’buffer’という領域がオフセット32以上、1056未満の範囲で宣言されている。
・オフセット33ということは’buffer’という変数の領域内のメモリアクセスであり問題はない。
・アドレス 0x7ffee2bca520 は、test42.cppの3行目で確保された、スレッドT0におけるこのフレームのスタック領域での32バイト目にあたる
・このスレッドのこのフレームでは4行目で宣言された’buffer’という領域がオフセット32以上、1056未満の範囲で宣言されている。
・オフセット32ということは’buffer’という変数の領域内のメモリアクセスであり問題はない。
【ログから推測できる不具合の内容】
・領域が重複している時はmemcopyを使う必要があることをしらなかった(ダメという事をしらない)
・コピー元もしくはコピー先アドレスの計算に問題があり、意図せずに(結果的に)重複してしまっている
・コピーするサイズの計算に問題があり、意図せずに(結果的に)重複してしまっている
参考)上記のログを発生させたソースコード
#include <string.h> int main(int argc, char *argv[]) { char buffer[1024]; // 1バイトずつ後ろにつめる memcpy(buffer + 1, buffer, 1023); return 0; }
参考)コンパイル・実行例
$ clang++ -g -O0 -o test42 -fsanitize=address test42.cpp $ ./test42