構造体の初期化時にinline関数で値を設定するとバグるらしい

inline関数をdefineマクロの代わりとして使ってきたうちに起こったコンパイラ(VC8.0)のバグ。

これが理解できるまで不思議なデバッグを繰り返していました。

要はこんなことです。

#defien RET_A(x,y) (((x) << 16) | (y)) inline int ret_a(int x,int y){ return (x << 16) | y; } struct val{ int a; int b; } struct val c_vValue[] = { { RET_A(0,0), RET_A(1,0) }, { ret_a(0,0), ret_a(1,0) }, { 0, 0 } }; [/cpp]

このとき、c_vValue[2]の位置がコンパイラの最適化時のバグで変な位置に配置されることがあるようです。

(c_vValue[1]とc_vValue[2]の間にパディングがされてしまうらしく、c_vValue[2]の位置に正しいデータがきていない)

しかもこのバグ、デバッグ時は出ないようで、調べるのにとっても苦労しました。リリースビルド時にメモリのデバッグが必要になり、

変数をウォッチしてのデバッグがほとんどできない状態ですからね・・・。

というよりは、この手のinlineでグローバルな構造体をリンク時に初期化する方が問題?

そしてもしかしてこれのパッチはすでにある?

LINEで送る
[`fc2` not found]
このエントリーを Google ブックマーク に追加

コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL