時折、リリース ビルドや一部のマシンでのみ再現可能なバグに遭遇することがあります。一般的な (決してそれだけではない) 理由は、初期化されていない変数であり、ランダムな動作をする可能性があります。たとえば、初期化されていない BOOL は、ほとんどのマシンでほとんどの場合 TRUE になりますが、ランダムに FALSE として初期化されます。
私が望んでいるのは、CRT メモリの初期化の動作を変更して、このようなバグを洗い流す体系的な方法です。私は MS デバッグ CRTマジック ナンバーをよく知っています。少なくとも、0xCDCDCDCD (新たに割り当てられたメモリを初期化するパターン) をゼロにするトリガーが必要です。デバッグビルドであっても、この方法で厄介な初期化害虫を簡単に吸い出すことができると思います。
これを可能にする利用可能な CRT フック (API、レジストリ キーなど) がありませんか? そこにたどり着くための他のアイデアはありますか?
[編集:]説明が整っているようです。
- 通常のマジック ナンバーには確かに多くの利点がありますが、bool の初期化 (常に true)、個々のビット マスクに対してテストされるビット フィールド、または同様のケースをカバーしていません。一貫したゼロ初期化 (もちろん、オンとオフを切り替えることができます) は、他の方法ではまれな初期化動作の悪さを表面化させる可能性があるテストのレイヤーを追加します。
- もちろん、私はCrtSetAllocHookを知っています。このように設定されたフックは、割り当てられたバッファーへのポインターを受け取らない (そのようなバッファーが割り当てられる前に呼び出される) ため、それを上書きすることはできません。global new をオーバーロードしても、有効なコンストラクターの初期化が上書きされるため、あまり効果がありません。
[編集:] @Michael、new をオーバーライドする意味がわからない。次のような単純なコード -
void* new(...)
{
void* res = ::new(...); // constructors now called!
if(SomeExternalConditionApplies())
OverWriteBufferWithMyPetValues(res);
}
動作しません。::new コード全体を貼り付けて変更するとうまくいくかもしれませんが、ちょっと怖いようです (神は、実行するために #include してリンクする必要があることだけを知っています)。