#author("2018-07-09T14:49:14+00:00","","") #topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#d012f75f] #contents(); ////////////////////////////////////////////////////////////////////////////// * バッファオーバーフロー [#f84a15f8] //============================================================================ ** -D_FORTIFY_SOURCE で検出する [#a8b72f7f] - GCC の "Automatic Fortification" 機能を使って、バッファオーバーフローを起こしやすいとされている関数(gets, strcpy, memcpy など)の誤使用をコンパイル時・実行時に検出する //---------------------------------------------------------------------------- *** 使い方 [#pd1bf5d5] - 下記のオプションを付加してコンパイルする: -O1 以上 -D_FORTIFY_SOURCE=1 - これにより、次の2つのタイミングでバッファオーバーフローの検出が行われる: |~チェックするタイミング |~チェック内容 | |コンパイル時 |コンパイル時にチェック可能な明らかなバッファオーバーフロー | |実行時 |上記以外のバッファオーバーフロー | - チェックの強化 -D_FORTIFY_SOURCE=1 を -D_FORTIFY_SOURCE=2 にすると、より厳しくチェエクされるようになる。 -- 一例として、format-string bug がランタイムに検出されるようになる。 --- printf, vfprintf, syslog などの関数が "%n" を含むフォーマット文字列を引数に取って呼ばれると abort する。 //---------------------------------------------------------------------------- *** チェックされる関数の一覧 [#v8699aa6] - 下記コマンドで一覧を取得出来る: $ grep -r "_chk" /usr/include/ | sed 's/.*\(__.*chk\).*/\1/' | sort | uniq ////////////////////////////////////////////////////////////////////////////// * メモリリーク [#eb135ca8] //=============================================================================== ** valgrind [#kc13d385] //------------------------------------------------------------------------------- *** 使い方 [#je53c69b] + ''-g'' 付きでビルド + 下記コマンドで実行する # valgrind --tool=memcheck --leak-check=yes <program-file-name> //------------------------------------------------------------------------------- *** vgcore [#v0255d98] - coredump した場合、 vgcore.<PID> という名前でファイルを出力する。 - vgcore は、通常の core と同様、 gdb に読み込ませて解析に使用出来る。 //------------------------------------------------------------------------------- *** 特徴 [#j3dafdc2] - スレッドセーフである - プロセス全体の起動から終了までを調べることしか出来ないため、部分的な検査は面倒になる。 //=============================================================================== ** mtrace [#f2d6f462] //------------------------------------------------------------------------------- *** 使い方 [#nc3a0a4a] + ヘッダをインクルードする #include <mcheck.h> + リークのテストを開始したい場所で ''mtrace()'' をコール + 終了したい場所で ''muntrace()'' をコールする + ''-g'' つきでコンパイル + 環境変数 ''MALLOC_TRACE'' を export する # export MALLOC_TRACE=<log-file-name> + プログラムを実行する - ${MALLOC_TRACE} に出力されたログの例 = Start @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049a98 0x1 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049aa8 0x1 @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x8049aa8 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049ab8 0x64 = End ~ ここで、 + は new - は delete + 以下の環境変数を指定することでメモリ領域の破壊などについてはデバッグしやすくなるかもしれません。 export MALLOC_CHECK_=”値” 値は0〜3です。 MALLOC_CHECK_ = 0 何もしない MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示 MALLOC_CHECK_ = 2 abort MALLOC_CHECK_ = 3 1と2の両方 //------------------------------------------------------------------------------- *** 特徴 [#kfaa7f43] - スレッドセーフではない - ソース内でどこからどこの間でリークを調べたいかを指定できる //=============================================================================== ** 参考リンク [#xaf6b376] - [[メモリーリークの検出:mtrace , valgrind>http://blogs.itmedia.co.jp/komata/2009/10/mtrace-valgrind.html]] - [[メモリーリーク調査方法>http://www.nianyan.net/library/memory.html]]