静的に定義された配列(つまり、malloc(1234)
ではなくchar[1234]
)のバッファオーバーランを識別できるツールまたは方法はありますか?静的バッファオーバーランを識別/防止するためのツールと方法
私は最終的に以下の行によって引き起こされることが判明クラッシュと奇数行動追跡昨日の大半を費やし:
// ensure string is nul terminated due to stupid snprintf
error_msg[error_msg_len] = '\0';
このインデックスは、明らかに、配列の境界を越えて書き込みを引き起こしたが。これにより、ポインタ変数が壊れてしまい、後でそのポインタで予期しない動作が発生します。
このような問題を軽減することができ頭に浮かぶ3つのものがある:
コードレビュー
これは実行されませんでしたが、私はそれに取り組んでいます。
valgrind
私は、多くの場合、メモリの問題を検出するために、開発中valgrindのを使用しますが、それは静的な配列を扱っていません。上記の例では、それは私には無効な
free()
のclobberedポインタのような症状しか示されませんでした。過去には-fstack-protector-all
私は、上記のようなそれは、このインスタンス内のフラグは何もしませんでしたいくつかの奇妙な理由でオーバーランを検出する
-fstack-protector-all
を使用しています。
どのように私がそのようなオーバーランを特定できるかについてのアイデアは誰でも提供できますか?上記のリストや全く新しいものを改善することによって。
EDIT:これまでの回答の中には、かなり高価な商品が挙げられています。この段階で私はそのようなツールを買う力を納得させることはできないと思うので、ツールを安く/無料に制限したいと思っています。はい、あなたはあなたが支払うものを手に入れますが、若干の改善は誰にも勝るものではありません。
私はそれが質問された質問には関係ないと知っていますが、 'snprintf'はヌル終了します。 –
私はこれらのエラーをキャッチするためにCoverityを使用しました。これは優れた静的解析ツールです。しかし、それは無料ではない(または安い) – TJD
@スティーブ・ジェッソップ良い点。あなたが何らかの形で利用可能なバッファサイズ(それ自体の問題です)よりも多くを書いたならば、その種の保護が必要な 'sprintf'です。だから、その行にはバッファオーバーランがあっただけでなく、無意味でもあったことが判明しました。ブー。 –