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