2012-03-06 9 views
1

一部のコードでは、セグメンテーションフォルトが発生し、gdbのstacktraceは、ポインタが0x1を指していることを示しています。我々は、これらのセグメンテーションフォールトの3つのインスタンスをそれぞれに持っています。ポインタは0x1を指すようになります。ポインタが0x1を指している - ヌルが有効であることを確認していますか?

このエラーから「優雅に」回復したいと思います。 SEGFAULTの代わりに私はNULLを確認できません。それは0になるからです。アドレス0x1を明示的にチェックしていますか?

これはおそらくGCC3.4.2(SLES9マシン)

+0

何プラットフォームが上のこのですか? (CPUアーキテクチャとオペレーティングシステム) – wallyk

+1

os – shergill

答えて

8

を使用して、Linux上ではありません。 NULL値がソースに0で示されているので、0x1がNULLかどうかを確認するとfalseが返されます。

への道は、そのような場合には、それを使用しよう0x1はNULLと同じくらい悪いことを想定していないことであろう(技術的には、回復がもっともらしいではない、あなたが本当に防ぐために必要がある)のようなものをを回復します

if ((p == 0) || (p == 0x1)) 
    return; 
// Otherwise use p. 

しかし、私はそれを優雅に呼び出すことに大変躊躇します。 することは、ポインタがその無効な値に設定されている原因を追跡し、修正することです。

これは、誰かがハンマーで頭を叩いたときに頭痛を止めるのに似ています。あなたは頭痛を和らげるためにタブレットを取ることができますが、確かに問題の根本原因を修正する(ハンマーを止める)方が良いでしょう。

+0

フィードバックに感謝します – shergill

+0

これに先立って私はそれを修正することに同意します。ちょうど(4kページサイズを仮定して) '(ptr <(void *)0x1000)'をチェックする方が良いかもしれないことを指摘しておきたい。あるいは、PAGESIZE '#define'があればそれを使用してください。 '0x0'のページがマップされないことをかなり確かめることができるからです。 – mpontillo

+0

値が<0x10000であるNT上のすべてのポインタは無効であることが保証されています。現代のLinuxでもこれは保証されていますが、これは古いバージョンのLinuxです(VA 0x0をmmapして楽しいEoPエクスプロイトにつなげることはできません) –

7

あなたはヌルを指している構造を逆参照しているので、はい、あなたは0x1に指し示すポインタを取得している理由は、最も可能性が高いです。

struct some_struct* ptr = NULL; 
char blah = ptr->foo; 

そして、それから1オフセットでfooであることを起こります構造体の開始点。だから、数学は*(0+1)に終わる。

+2

そうかもしれませんが、 '&ptr-> foo!= 0x01'ではなく、' ptr!= NULL'をチェックする必要があります。 – Ferruccio

+0

はい、もちろんです! –

3

null引数に特定の意味を割り当てないコードにヌルポインタを渡してインタフェースの契約に違反した場合、「正常に回復しました」というようなことはありません。無効なプログラム状態の量に制限はなく、未定義の動作を既にどこかに呼び出している可能性があります。

私はすでに過去のSOにこのトピックに関するたくさん書いてきたので、私は私の論文へのリンクあなたをちょうど残しておきます:

In either C or C++, should I check pointer parameters against NULL/nullptr?

関連する問題