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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takker
記事: 2
登録日時: 11年前

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

#1

投稿記事 by takker » 10年前

初めまして、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ライブラリの内部構造はまだ一部しか把握していません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

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を起こすので、デバッグやジャッジ環境のテストに用いることができます。
キャストする型と代入する値を変えても同じ効果だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

takker
記事: 2
登録日時: 11年前

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

#3

投稿記事 by takker » 10年前

みけ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というのは聞いたことがなかったので、あとで詳しく調べようと思います。
教えていただいて有り難うございます。これで解決とさせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る