2011-02-17 7 views
2

ヒントによるanother thread逆参照がセグメンテーション違反を引き起こすかどうかを判断するには、ポインタを分析する必要があります。アイデアは、このようなコードを記述することです:openとwriteでの/ dev/nullの特別な扱いは?

bool IsPointerValid(void* pPointer) 
{ 
    // when opening "/tmp/hugo" here, it works fine... but not with /dev/null?? 
    int iFD = open("/dev/null", O_WRONLY); 
    int iBytesWritten = write(iFD, pPointer, 4); 
    close(iFD); 

    return iBytesWritten > 0; 
} 

をしかし、私はIsPointerValid(..)に渡すwhatevery、それは常にtrueを返します - iBytesWrittenは常に4ですので。しかし、"/tmp/testfile"またはfifoを開くと、期待どおりに動作します。NULLポインタをwrite(..)に渡すと、-1が返されます。

"/dev/null"のこの特別な治療の理由は何ですか?

おかげで、

チャーリー

答えて

5

それは特別なファイルですので、readwriteの独自の定義をもたらしますので。 (linuxカーネルはドライバ層の関数ポインタを使って多態性を実装しています)。どうやら、/dev/nullデバイスによって提供されたwriteのバージョンは、あなたが渡したポインタを使用していません。

+0

Hmmm ...しかし、それは悪いです。一時ファイルを作成せずにこの問題を回避するにはどうすればよいですか? – Charly

+1

ポインタを逆参照するとsegfaultが発生するかどうかを知りたいので、逆参照してsegfaultを処理するのはなぜですか?それに必要なファイルはありません。 –

+0

私はポインタを事前にチェックすることをお勧めします - それは分かりやすく分かりやすいからです。 – Charly