2006年05月28日

正しいのはどっち?

先日.netを最新バージョンにしたらはまったバグ。

void foo(void)
{
  if(0 != func()){
    error();
  }
}

char func(void)
{
  return (0);
}

という感じのプログラムで、何故か0を返しているのにerror()が実行されるという現象に出会った。
問題のソースは10数年以上、プレステやらプレステ2やらXBOXやらで使われて正常動作し続けてきたソースなので、こんなショボイ不具合が起こるわけがない。
これは最新の.netが何かおかしいのだろうか?と思い調べていたらなんとこんな行が!

extern int func(void);

本来char型の返り値の所を、externでint型として宣言してた!
つまり返り値として保証されているのは1byteだけで、その他上位3byteは保証されていない値だったため、ゴミ部分を読んで0以外の値と認識してしまっていたのだ。
ここで疑問なのは、果たしてこの挙動はコンパイラとして正しいのだろうか?
今まで10数年間問題なかったとはいえ、ただ単にまぐれで動いていただけかもしれないが、charだろうがintだろうが入ってる数値が変わるのはおかしいという気もする。
まぁどっちみちwarning出てるから、値は保証されないというのが正しいのかなぁ。ほんとは.netのせいにしたいけどw
後の人が苦労するので、warningはちゃんと潰しておこうね。
posted by kama at 20:47| Comment(2) | TrackBack(0) | 未分類
この記事へのコメント
ぼくは未だにVisualStudio6.0…
そろそろ移行するかな。
Posted by モアイ at 2006年05月29日 08:16
.netにしても良い事ないよ・・・新しいwarning出まくるし。
.NET FrameworkとかC#とか使わないなら、無理にバージョンアップしなくても良い気がする。
Posted by kama at 2006年05月29日 10:56
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/26377889

この記事へのトラックバック