14.04ではセグメンテーション違反が発生したが、10.04では失敗しなかった

14.04ではセグメンテーション違反が発生したが、10.04では失敗しなかった

私は Ubuntu 14.04 64 ビット LTS を使用しており、C で画像処理プログラムを書いています。ターミナルでプログラムを実行すると、セグメンテーション エラー (コア ダンプ) が表示されます。
同じプログラムは 10.04 では問題なく動作します。

何か助けてください。

$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)

答え1

実際に何が起こったのかを詳しく伝えるのは難しいですが、どのような問題が起こったかの例を挙げてみます。

重要なのは、プログラムが 10.04 では動作したが、14.0 では動作しないということです。正確な問題は異なる可能性がありますが、類似しており関連しています。

何かが規則に違反している

「セグメンテーション違反」エラーは通常、プログラムに属していないメモリにアクセスされたことを意味します。10.04 と 14.04 の両方で、このような不正なメモリ アクセスがあった可能性がありますが、10.04 では問題は発生しませんでした。

ルールは厳格に施行されていない

つまり、10.04 では偶然に動作したことになります。これは、さまざまな理由から、プログラムの「公式」メモリの近くにあるメモリも技術的にはプログラムに属する可能性があるため、十分にあり得ます。
これは、コンパイラの思考を容易にするため、またはより規則的なメモリ アクセスによってプログラムを高速化するためです。
これにより、プログラムは、プログラム テキストに基づいて許可されていない操作を実行できるようになります。

許容度は変化する

セグメンテーション違反なしでアクセスできる「非公式」メモリは、コンパイラのバージョンとライブラリのバージョンによって異なり、どちらも変更されています。

最も単純で最も一般的なケースは、インデックスの of-by-one エラーによって配列の後のバイトにアクセスするなど、メモリ アクセスが過度に行われたプログラムにバグがある場合です。

まとめ

このバグは以前から存在していましたが、それでも動作していました。
現在は動作せず、セグメンテーション エラーを引き起こす通常のバグになっています。

良い面としては、バグがあっても動作していたときに間違った結果が生成された可能性があり、これは現在発生しているクラッシュよりもはるかに悪い状況です。


ルールを施行する

この種の問題をデバッグする良い方法は、通常のランタイムシステムでは強制されないルールを強制するようにプログラムをインストルメントすることです。
メモリアクセスの問題を探すときにこれを行うツールの1つは、ヴァルグリンドman valgrind)。

関連情報