先日.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はちゃんと潰しておこうね。
2024年10月 日 月 火 水 木 金 土 « 1月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 -
最近の投稿
最近のコメント
- FPVのために、開局申請 に 出撃準備中 | kamaの日常 より
- CBR1100XX ルテニウムプラグ導入 に kama より
- CBR1100XX ルテニウムプラグ導入 に kama より
- CBR1100XX ルテニウムプラグ導入 に 匿名 より
- CBR1100XX ルテニウムプラグ導入 に kama より
人気の投稿
- 第16回こうのす花火大会に行く- 2017年10月8日23:58
- CBR1100XX ルテニウムプラグ導入- 2022年5月5日21:39
- SC57 CBR1000RR AnniTORi RACINGクイックシフター取り付け- 2018年7月2日09:23
- YZF-R1高速道路試乗- 2017年6月11日23:23
- ラジコンコースがある上奥富運動公園- 2017年4月16日20:02
アーカイブ
カテゴリー
メタ情報
LINK