ぱっと見は、間違ってないように見えるかもですが、実はとんでもないバグが潜んでいたり。。汗
int main(void)
{
unsigned short s=0;
unsigned short e=0xffff;
for(unsigned short i=s; i<=e; i++)
{
printf("%d\n",i);
//if( i== 65535) {break;}
}
}
i== 0xFFFE になる: 0xFFFE <= 0xFFFF 成立するのでループ
iに1足す
i== 0xFFFF になる: 0xFFFF <= 0xFFFF 成立するのでループ
iに1足す
(本来なら 0x10000 になるはずが、unsigned short は、0x0000 〜 0xFFFF
までしか扱えないのと、C言語はオーバーフローを教えてくれないため、i== 0x000になる
i== 0x 0000 になる: 0x 0000 <= 0xFFFF 成立するのでループ
以下、ずっと成立し続ける
これで、無限ループに陥ってしまうと。
結構有名な話?
どうやっって回避するかというと、単純に 全てのunsigned short を、int に変えれば治ります、
iP6 Plus のモニターモードの loadmem / savemem などが、盛大にバグってました。
なんだかなぁ。。
C言語は、高級アセンブラと呼ばれる所以??
というわけで、C言語の場合は、しれっと、情報が欠落してしまうために、無限ループに陥ってしまうわけですが、Rust だと、どうなるでしょうか?
fn main() {
let mut i:u16=0;
while i<= 65535 {
println!(" {}\n",i);
i+=1;
}
}
thread 'main' (12949949) panicked at src/main.rs:6:9:
attempt to add with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
ちゃんと、”オーバーフロー”で、落ちてくれましたね。
流石です。 ( ´ ▽ ` )ノ
最近の言語なので、これぐらいは普通かも




