3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rust】Releaseビルドでも整数オーバーフローをpanicさせる

Last updated at Posted at 2022-02-19

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);
}
Debugビルド時の実行結果
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:5:27
Releaseビルド時の実行結果
9

Playgroundで確認

実行時のオーバーフローのチェックにはコストがかかるため、パフォーマンスを最大化したいReleaseビルド時にチェックが取り除かれるのは理に適っています。

しかし、要件によってはそこまでシビアなパフォーマンスを要求しておらず、むしろ誤動作防止のためにReleaseビルド時も整数オーバーフローをpanicさせてほしいというケースもあるかと思います。

このようなニーズを満たしたい場合は、Cargo.tomlでReleaseプロファイルのoverflow-checkstrueに設定します。

Cargo.toml
[profile.release]
overflow-checks = true

参考: https://doc.rust-lang.org/cargo/reference/profiles.html#overflow-checks

こうすることで Releaseビルド時もDebugビルド時と同様、実行時にオーバーフローのチェックが入るようになり、オーバーフローした場合はpanicを起こします。

overflow-checksをtrueにした際の、Releaseビルド時の実行結果
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:5:27

パフォーマンスとのトレードオフにはなりますが、使えるケースはそれなりに多いのではないでしょうか。
プロジェクトによっては最初からoverflow-checks = trueで設定しておいて、パフォーマンス上の懸念が出てきたときに初めて検討するくらいでもいいかもしれませんね。

以上。お読みいただきありがとうございました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?