トップ «前の日記(2010-06-15) 最新 次の日記(2010-06-17)» 編集

日々の破片

著作一覧

2010-06-16

_ VC++のバグ

発端:バグか?バグなのか?

結論:0 < 0 は true らしいぞ

追記:(ちゃんと上のリンクをたどると、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 アカデミック(-)

アカデミックは安いな。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え