Znajduję to, co uważam za bardzo dziwne zachowanie. Rustc panikuje, gdy zmienna przepełnia się podczas pracy; To ma dla mnie sens. Podnosi jednak tylko ostrzeżenie, gdy przepełniona wartość jest przypisywana w czasie kompilacji. Czy nie powinien to być błąd czasu kompilacji? W przeciwnym razie dwa zachowania wydają się niekonsekwentne.Rustc ostrzega tylko, gdy wartość, która przepełnia, jest przypisana
Spodziewam się błąd czasu kompilacji:
fn main() {
let b: i32 = 3_000_000_000;
println!("{}", b);
}
produkuje:
<anon>:2:18: 2:31 warning: literal out of range for i32, #[warn(overflowing_literals)] on by default
<anon>:2 let b: i32 = 3_000_000_000;
to sens do mnie:
fn main() {
let b: i32 = 30_000;
let c: i32 = 100_000;
let d = b * c;
println!("{}", d);
}
produkuje:
thread '<main>' panicked at 'arithmetic operation overflowed', <anon>:4
playpen: application terminated with error code 101
Edit:
Biorąc pod uwagę komentarz przez FrancisGagné i mnie odkrycie, że Rust wdraża operatorów, które sprawdzają na przepełnienie podczas operacji, na przykład checked_mul, widzę, że trzeba samodzielnie przeprowadzać kontrole przelewów. To ma sens, ponieważ wersja oprogramowania powinna być zoptymalizowana, a ciągłe sprawdzanie, czy przepełnienia nie są zbyt kosztowne. Nie widzę już "niespójności". Nadal jestem jednak zaskoczony, że przypisanie wartości, która spowodowałaby przepełnienie, nie doprowadzi do kompilacji błędu czasu. W golang
miałoby to: Go Playground
Trudno jest zrobić dowolną stałą propagację. Ciągły ewaluator Rusta nie jest jeszcze wystarczająco mocny, ale jest bardzo prawdopodobne, że twój drugi przypadek zostanie ostrzeżony w pewnym momencie. Jeśli użyjesz stałych zamiast dozwolonych wiązań, otrzymasz ostrzeżenie nawet podczas mnożenia: http://is.gd/1k9xtX –
oh. Źle zrozumiałem. Domyślam się, że wszyscy próbują stworzyć kompilację bez ostrzeżenia. –
Należy zauważyć, że drugi program tylko panikuje w kompilacji debugowania; nie ma sprawdzeń przepełnienia w kompilacji wydania. Kompilacja wydania drugiego programu wypisuje '-1294967296', podobnie jak pierwszy program. –