2017-01-08 23 views
0

AIXで自分のコードを実行しているときに、不明確でセグメント化エラーが発生しています。次の行:AIX:未知のセグメンテーション・フォルトの問題

sourceSample +=value; 

は、セグメント化エラーを示します。ここで、sourceSampleは画像を指し示すポインタです。

私は上記のコード行にいくつかの変更を行い、次の処理が行われます。

  1. int *p = sourceSample; sourceSample = p + value;セグメンテーションフォールトが持続します。

  2. int **p = &sourceSample; sourceSample = *p + value; セグメンテーションフォルトがなく、コードが成功して実行されます。

これはなぜ起こっているのですか?

ps:これはStackOverflowの最初の質問ですので、私が何かを見逃してしまった場合は私に謝ってください。

+1

あなたが欠けていたことは、コードから関連する抜粋全体を投稿していたため、問題を再現することができました。参考:[MCVE] –

+0

(a)元のソース行が何をしようとしているのか、(b)それらの変更が実際に何を意味するのか、そしてそれらがどのように異なっているのか知っていますか?もしそうでなければ、私は今あなたに知らせるでしょう:*推測*はあなたがプログラムを学ぶ方法ではありません。 – WhozCraig

+1

準拠したC++実装で実行されているC++プログラムからセグメンテーションフォルトを得る唯一の方法は、そのプログラムが未定義の動作を示すことです。未定義の性質を判断するには[mcve]が必要ですが、 'sourceSample + value'は' sourceSample'が指すオブジェクトの境界の外側を指している可能性があります。このようなポインタ値を計算しようとすると、未定義のビヘイビアが生成されます。技術的に結果を間接参照する必要はありません。 –

答えて

0

問題が見つかりました。 問題は、誤ったアセンブリコードがAIXで生成されたためです。それは使用し、これに「値」を追加した後sourceSampleにアクセスしようとすると、セグメンテーション違反が発生している:

if(bitPos == bitPos_renew) { 
    sourceSample += value; 
} 

を「値が」sourceSampleポインタに追加され、sourceSampleがアクセスしようとすると、AIXは、セグメンテーション違反が発生します。これは、変数 'value'の値が間違っているためです。

value = sx <= ex ? 1 : -1; 

'に割り当てられた値が1または-1であるべきであるが、我々はアセンブリコードで参照したときに64ビットのレジスタに割り当てられた値は変数を参照:

は「値」の値を使用して割り当てられます値は」

00000000FFFFFFFF

なく

です

FFFFFFFFFFFFFFFF(-1)「値が」sourceSampleに追加される。このため

、それがセグメンテーション違反を引き起こすいくつかの割り当てられていないメモリを指し始めます。

変数 'value'の値を表示しようとすると、アセンブリコードが自動的に正しく取得され、正常に実行されます。

これは、コンパイラが最適化されているためです。最適化レベルをO0に設定してすべての最適化を削除した場合、アセンブリコードは完全に問題なく、セグメンテーションフォルトはありません。

関連する問題