2017-02-21 5 views
2

私はめったに未定義の動作(セグメンテーションフォルト)を引き起こす巨大なソースコードを持っています。私は原因を追跡しようとしましたが、未定義の動作が起こることはまれであるため、これは困難でした。私はソースコードを見直しましたが、空の配列の定義が含まれていますが、ソースコードではまったく使用されていませんでした。配列が使用されていなくても、空の配列を定義することは未定義の動作の原因になりますか?

struct any array[] = {}; 

私は空の配列を定義することC.では許可されていないことを知っているしかし、私は、これは、配列が使用されていない、特にこと、未定義の動作の原因である可能性がありますかはわかりません。

空の配列を定義すると、配列が使用されていなくても未定義の動作が発生する可能性がありますか?

+3

これはCでコンパイルするべきではありません。コンパイルするとコンパイルの拡張機能なので、コンパイラのドキュメントを見て、それが何であるかを知る必要があります。しかし、コンパイラがそれを受け入れるなら、未定義の動作である可能性は低いです。だから、あなたは「OK」になる可能性がありますが、使用されていない場合は単にそれを削除しないでください。 –

+0

@JonathanLeffler私はそれを削除しますが、それがUBの原因であるかどうか確かめたいのですが – MOHAMED

+4

それがUBのソースだったら驚くでしょう。何か別のものを探してください。 –

答えて

0

ウィキペディアによれば、プログラムがアクセスが許可されていないメモリ位置にプログラムがアクセスしようとしたとき、または許可されていない方法でメモリ位置にアクセスしようとしたときに(たとえば、読み取り専用の場所、またはオペレーティングシステムの一部を上書きする)。

したがって、あなたの場合、あなたは変数にアクセスしていないので、エラーの原因は何か他のものになるはずです。

0

未定義の動作では、何かが可能です。 C標準に準拠するようにこの行を修正する必要があります。次に、セグメンテーションフォルトが再び発生した場合、問題がまだ存在することがわかります。

(はい、これは簡単な答えですが、言いたいことはありません)。

1

valgrindメモリチェッカーの制御下でプログラムを実行してください。

valgrindメモリアクセスに関する多くの種類のチェックを実行します。ほとんどの場合、目に見える問題は発生しませんが、状況によってはクラッシュを引き起こす可能性のあるものも含めて、無効なメモリ参照を追跡できます。

+1

絶対これ。推測をやめ、期待してください。実際にメモリの問題を特定するツールを使用します。 –

関連する問題