テスト済みのコード万歳

だって動くんだもん。

コンパイラのバージョンがあがったら、関数の呼び出し前後で呼出し元のローカル変数の値が変わる現象が発生。関数に引数として渡したアドレスを足がかりに、近隣の変数を壊すようなコードが発覚。書いた人は、sizeof(char*)が1になることを期待していたか*1、単に考えていなかったか、誰かが間違って書いたやつを流用したとか、きっとそういう感じ。以前の環境で発症しなかったのはなんでだ?ローカル変数のスタック上の位置が変更になったのか?以前はたまたまその後参照しない変数を壊していたのか?興味深いけど、仕事上は動いてしまえばこれ以上時間を割く訳にも行かない(ほんとか?同じような箇所を全部探さなきゃならんので後XX日必要ですよね?とか言って休暇を取りたい気もする)。

C言語ばっかりやっていると

それをこちらがデバッガを使って追って行こうとしていた矢先、ソース見て数分で読み当ててみる人が居たり、さすが10数年C言語ばかりやっていると違うと思った。
さて、sizeofがポインタのサイズをとろうとしているところはおそらくバグだろうと予想できた訳なんだけど、これを一網打尽にする方法は無いだろうか?

スタック破壊に関しては/RTCってオプションが有用なの?

なんか便利そうなんだけど、MSVCを使うにも関わらずランタイムライブラリがサードパーティー製なせいか、思いっきり動かないような感じで、要するに成功してません。

苦肉の策として

そのソースを書いた人の名前で grep する。結構当たる。当たるんだけど、その人以外のところのソースが妥当かどうかは結局チェックしなきゃいけないので、さしあたってテストに支障がない程度までコアダンプの頻度を下げるという効果だけに期待。

*1:ちなみにstrlenが原因で他の領域を壊す例も同時期に発覚してます