attempting double-free

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

コメントを残す

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