memcpy-param-overlap

具体例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

コメントを残す

メールアドレスが公開されることはありません。