プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

memstompの使い方 このエントリーをはてなブックマークに追加

memstompというライブラリがある。
デバッグ用ライブラリでmemcpyやそれに類する関数で2つの引数が指す領域がオーバーラップしており不定動作になってしまうようなケースを検出して間違っている箇所をバックトレースで教えてくれる。

対象の関数は以下

memcpy(), memccpy(), mempcpy(), strcpy(), stpcpy(), strncpy(), stpncpy(), strcat(), strncat(), wmemcpy(), wmempcpy(), wcscpy(), wcsncpy(), wcscat(), and wcsncat()



使い方は、Red Hat社 による、Red Hat Developer Toolset のドキュメントが一番わかり易い
https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/sect-memstomp-Use.html

残念なことに Developer Toolsetのsclコマンドの使い方と混ざってしまっていて、Fedora、RHEL7でどうすればいいのか今ひとつ分かりにくいので簡単に解説してみる。
なお元ドキュメントはCC-BY-SAライセンスなので、この記事では遠慮なくサンプルコードを再利用させてもらう事にする。

この手のライブラリの定番ではあるが内部動作としてはLD_PRELOADを使っているが、利便性のためにラッパーコマンドが提供されており普段はこちらを使うことになる

# memstomp [-dk] program [argument...]



-d, --debug-info はバックトレース表示時にdebug infomationを使うという指定。これを指定しないと行番号が取れないので使用を強く推奨。
-k, --kill はオーバーラップ発見時にプログラム実行を停止するオプション

詳しく知りたい人は以下のURLに man を転載しておくのでどうぞ
https://gist.github.com/kosaki/9561104


さて、最初のURLのサンプルに戻る(コピペしやすいように以下のURLにコードを転載しておく https://gist.github.com/kosaki/9560671
見ての通り、strcat(employee, email) の行が間違っており、引数が overlapしてしまっている。

こいつを

# gcc -rdynamic -g -o employee employee.c



とコンパイルし、
※ -rdynamic はデバッグオプション非使用時のバックトレースをリッチにするためだけに必要なので -g があればなくても良い

# memstomp --debug-info ./employee



と実行する。
参考までに私の環境での実行結果を貼っておく https://gist.github.com/kosaki/9561220





関連記事


linux | 【2014-03-14(Fri) 21:59:05】 | Trackback:(0) | Comments:(0)
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。