Rustで次のように整数オーバーフローしてしまう式を書いた場合、Debugビルドではpanicを起こしますが、 Releaseビルドでは無視して桁あふれします。
fn main() {
// 10と数値リテラルで書くとコンパイル時にオーバーフローを
// 検知してエラーになってしまうので、検証用に回避
let ten: u8 = (0..10).len() as u8;
let u8_overflow: u8 = u8::MAX + ten;
println!("{}", u8_overflow);
}
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:5:27
9
実行時のオーバーフローのチェックにはコストがかかるため、パフォーマンスを最大化したいReleaseビルド時にチェックが取り除かれるのは理に適っています。
しかし、要件によってはそこまでシビアなパフォーマンスを要求しておらず、むしろ誤動作防止のためにReleaseビルド時も整数オーバーフローをpanicさせてほしいというケースもあるかと思います。
このようなニーズを満たしたい場合は、Cargo.toml
でReleaseプロファイルのoverflow-checks
をtrue
に設定します。
[profile.release]
overflow-checks = true
参考: https://doc.rust-lang.org/cargo/reference/profiles.html#overflow-checks
こうすることで Releaseビルド時もDebugビルド時と同様、実行時にオーバーフローのチェックが入るようになり、オーバーフローした場合はpanicを起こします。
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:5:27
パフォーマンスとのトレードオフにはなりますが、使えるケースはそれなりに多いのではないでしょうか。
プロジェクトによっては最初からoverflow-checks = true
で設定しておいて、パフォーマンス上の懸念が出てきたときに初めて検討するくらいでもいいかもしれませんね。
以上。お読みいただきありがとうございました。