初期化していないメモリが に設定されているのはなぜ0xCC
ですか?
メモリを に設定する0xCC
とパフォーマンスが低下するため、メモリをこのバイトで埋める理由が必要です。
初期化していないメモリが に設定されているのはなぜ0xCC
ですか?
メモリを に設定する0xCC
とパフォーマンスが低下するため、メモリをこのバイトで埋める理由が必要です。
Visual Studioを使用してプログラムのデバッグビルドをコンパイルし、デバッガーで実行すると、割り当てられたメモリまたは割り当て解除されたメモリに次のようなおかしな値が含まれていることがわかります。
0xCCコードが/GZオプションを使用してコンパイルされると、初期化されていない変数がこの値に自動的に割り当てられます(バイトレベルで)。
CCCCCCCCMicrosoftのC++デバッグランタイムライブラリが初期化されていないスタックメモリをマークするために使用します
Visual Studio CRTソースでは、\VC\crt\src\malloc.h
:
#define _ALLOCA_S_STACK_MARKER 0xCCCC
// ...
#undef _malloca
#define _malloca(size) \
__pragma(warning(suppress: 6255)) \
((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
_MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
_MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))
コンパイラはデバッグモードでこれを実行するため、初期化されていないメモリを誤って読み取った場合、特徴的な0xCC値が表示され、(おそらく)初期化されていないメモリを読み取ったことが認識されます。0xCC値には、他にも多くの便利なプロパティがあります。たとえば、初期化されていないメモリを誤って実行した場合にソフトウェアブレークポイントを呼び出すための機械語命令です。
基本原則:初期化されていないメモリの読み取りから生じる値を簡単に識別できるようにします。
これは、リリースビルドでは発生しません。
この手法は、SolidCodeの記述で導入されました。
/GZ オプションを使用してコードをコンパイルすると、初期化されていない変数がこの値に (バイト レベルで) 自動的に割り当てられます。
0xCC は、ブレーク ポイントを呼び出すマシン コード命令です。詳細については、別の質問を参照してください。