ページ 11

*( ( DWORD * )0 ) = 0xffffffff ;

Posted: 2015年2月10日(火) 06:29
by takker
初めまして、takkerと申します。
このサイトに登録したのはだいぶ前ですが、初めて質問をさせていただきます。

現在自分はDXライブラリの改造を行っています( Ver 3.13dです )。
その中のメモリ関連プログラムの改造を行っていたところ、
DxMemory.cpp 444行目に以下の様なコードを見つけました。

コード:

*( ( DWORD * )0 ) = 0xffffffff ;
( 444行目のみ抜粋 メモリが破壊されていた場合の処理の一部 )

いろいろ調べた結果、このコードは
  • NULLポインタ( C言語の NULL の定義は ( void* )0 )の示すアドレスに -1( DWORD 型で 0xffffffff はILP32/LLP64 データモデルで -1 )
    を代入している。
というコードで、OS に何らかのエラーメッセージを示すものだろう、
ということまで推測しました。
しかし結局このコードは何をしているのか、何の意味があるのか、はっきりとしたことはわかりませんでした。
実際にこのコードは何をしているのでしょうか?
オフトピック
DXライブラリの内部構造のことなので、本家の掲示板で質問したほうが良いかもしれませんが、
恐らくこのライブラリ特有のコードではないと考えたためこちらに投稿しました。
ちなみにDXライブラリの内部構造はまだ一部しか把握していません。

Re: *( ( DWORD * )0 ) = 0xffffffff ;

Posted: 2015年2月10日(火) 09:05
by みけCAT
takker さんが書きました:このコードは
  • NULLポインタ( C言語の NULL の定義は ( void* )0 )の示すアドレスに -1( DWORD 型で 0xffffffff はILP32/LLP64 データモデルで -1 )
    を代入している。
間違いがあります。
Windowsでは、DWORD型は32ビット符号なし整数なので、
0xffffffffが表す値は-1ではなく4294967295のはずです。
Windows Coding Conventions (Windows)
takker さんが書きました:実際にこのコードは何をしているのでしょうか?
推測ですが、自殺だと思います。

コード:

*((int*)0)=0;
というコードを実行すると、(多くの場合)Segmentation Faultを起こすので、デバッグやジャッジ環境のテストに用いることができます。
キャストする型と代入する値を変えても同じ効果だと思います。

Re: *( ( DWORD * )0 ) = 0xffffffff ;

Posted: 2015年2月10日(火) 19:29
by takker
みけCAT さんが書きました:
takker さんが書きました:このコードは
  • NULLポインタ( C言語の NULL の定義は ( void* )0 )の示すアドレスに -1( DWORD 型で 0xffffffff はILP32/LLP64 データモデルで -1 )
    を代入している。
間違いがあります。
Windowsでは、DWORD型は32ビット符号なし整数なので、
0xffffffffが表す値は-1ではなく4294967295のはずです。
Windows Coding Conventions (Windows)
すみません、確かにそうでした。定義をきちんと確認すべきでした。
みけCAT さんが書きました:
takker さんが書きました:実際にこのコードは何をしているのでしょうか?
推測ですが、自殺だと思います。

コード:

*((int*)0)=0;
というコードを実行すると、(多くの場合)Segmentation Faultを起こすので、デバッグやジャッジ環境のテストに用いることができます。
キャストする型と代入する値を変えても同じ効果だと思います。
なるほど、そういうコードでしたか。Segmentation Faultというのは聞いたことがなかったので、あとで詳しく調べようと思います。
教えていただいて有り難うございます。これで解決とさせていただきます。