#overflow #checked #arithmetic

overflow-proof

Rust 的单调检查算术

1 个不稳定版本

0.1.0 2021年10月24日

#1416数学

MPL-2.0 OR MIT OR Apache-2.0

11KB
235

Rust 的单调检查算术

此库提供了包装原始数值类型的类型,并跟踪溢出的可能性,强制执行正确处理,避免恐慌或不正确的值(当在发布构建中禁用溢出检查时)。

Checked 是此库提供的主要类型。

use overflow_proof::Checked;

let a = Checked::new(2u8);
let b = Checked::new(100u8);

// Aritmetic operations can be chained like with normal types
assert!({ ((a + 2) / 3 + 5) * b + 1}.check().is_none());
assert_eq!(*{ a + 2 + b }.check().expect("overflow"), 104);
use overflow_proof::{Checked, WithDeref};

struct OverflowError;

struct BankAccount {
  balance: Checked<u64, >,
}

impl BankAccount {
  fn debit(&mut self, amount: u64) -> Result<(), OverflowError> {
  // Will not compile:
  // Ok(self.balance -= amount)

  // Overflow must be checked:
  Ok(self.balance = {self.balance - amount}.check().ok_or(OverflowError)?)
  }
}

无运行时依赖