著作一覧 |
発端:バグか?バグなのか?
追記:(ちゃんと上のリンクをたどると、0 < 0が偽になるのは、API呼び出し先のアドレスがレジスタにキャッシュされたwhileループの時で、かつ0との比較かつ……のような複雑な条件のときだということがわかるんだけど、ぶくまされた部分だけ読んで単に0 < 0が偽になるバグがあるとか誤解しないでくださいね)
当人にとっては深刻ではあるが、無茶苦茶おもしろい。
ためしてみたけど、/O2 /GL でVS2008で再現した。
アセンブリリストを出してみたら、do { ... } while (0 < i); のようなコードが生成されていたから、そりゃ0を与えてもだめだなぁ。
それはだめな点だが、:Sleepの呼び出しがループの中で繰り返されるからだと思うが、dlにアドレスを突っ込んで、以降はレジスタ先へのcallになっているのにはしびれた。
で、明日は我が身ってこともあるので、確認してみたら/GLがプロジェクトのリリースビルドの規定値となっていたので、同僚とこれはおっかないなぁという話となった。
で、やっとこさ導入したVS2010で試してみたら、コメントにもあったけど確かに再現しない。
どんなコードを生成したのかと確認して驚いた。ループが外されて(多分、最大でも2というのを見ているのだろう)、DRYじゃないだめなプログラマが書いたようなコードにコンパイルされていてちょっとびっくり。条件判断もジャンプも無いんだから、そりゃ速いだろう。
確かに、そこら中のPCのメモリは最低でも2GBとかになっているから、その気持ちは良くわかるが、でもVC++を組み込み用に使っている人たちだっているのだから、本当にそのコンパイルで良いのか? という疑問もないわけではない。
Microsoft Visual Studio 2010 Professional アカデミック(-)
アカデミックは安いな。
ジェズイットを見習え |