- ベストアンサー
malloc呼び出し時のセグメンテーションフォルト
UNIX(HP-UX)上でCプログラムを組んでおります。 その際、mallocでセグメンテーションフォルトが起こりました。 mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そのようなケースでは、既にその malloc 以前のコードでメモリが 破壊されている事が多いです。 例えば、こんなミスが有るとメモリやスタック等が壊れる可能性大。 ・不正なアドレスを解放している、または多重解放している ・バッファ(配列)のオーバーまたはアンダー ・printf や scanf で型指定と引数型が合っていない 例)printf("%s", int値); ・printf や scanf 等の可変引数呼出で引数の数が合っていない 例)printf("%d %d", int値); また、malloc で要求したメモリ量が確保出来なかった場合に、メモリ 不足のエラーではなくセグメンテーションフォルトやアクセス違反等の エラーが発生した事も有りました。
その他の回答 (2)
- BILLY-J
- ベストアンサー率57% (60/105)
#1です。 >バッファのアンダーとはどの様な時に発生するのですか? 例えば配列をインデックス値ではなくポインタの加減算で参照 している時、更には後方検索などで最後尾から先頭に向かって ループさせるようなロジックで起こり得ます。 インデックス値がゼロを通り越してマイナスになってしまう ようなイメージです。
お礼
質問への回答ありがとうございます。 なるほど、配列の先頭より前を見てしまうような場合ですね。 アンダーという言葉からイメージが湧かなくて。。。お手数おかけしました。 まだまだ、解決の糸口が見つからないのですが頑張りますね。
- angband
- ベストアンサー率51% (86/168)
malloc自体が問題の場合はdmallocというライブラリが あります。これはmallocをリプレースして、各種検査が 可能になります。HP-UXでも使えます。 http://dmalloc.com/ mallocする前に壊れている場合は、デバッグはマジで 大変なものの1つだと思います(規模にもよりますが)。 ポインタ周りであれば、僕はCのプログラムでもとりあえず モジュールごとにclassで囲んでC++コンパイラでリンク してみます。クラスにしてみるとどのコードがだめなのか 判定できますし、コードを1行づつ追うのは精神衛生上 よくないでしょうしね・・
- 参考URL:
- http://dmalloc.com/
お礼
回答ありがとうございます。 頑張ってdmallocを利用してみます。 angbandさんはC++コンパイラでリンクしてみるとのことですが、C++に手をつけたことのない身としてはそちらの手段は目下の所無理そうです。 教えていただいたことは、もう少し余裕のあるときに試してみますね。
お礼
回答ありがとうございました。 指摘された点を地道に追ってみます。 回答に対する質問なんですが。。。 バッファのアンダーとはどの様な時に発生するのですか?