attempting free on address which was not malloc()-ed

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

コメントを残す

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