From a21fb956f99232da08c16ef643bcb10175289667 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Wed, 5 Oct 2016 20:45:40 -0500 Subject: [PATCH] insert more `abort()` calls where division by zero may occur --- src/int/sdiv.rs | 14 ++++++++++++++ src/int/udiv.rs | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/src/int/sdiv.rs b/src/int/sdiv.rs index 37f5dd7..d60dda9 100644 --- a/src/int/sdiv.rs +++ b/src/int/sdiv.rs @@ -1,3 +1,5 @@ +use core::intrinsics; + use int::Int; macro_rules! div { @@ -10,6 +12,12 @@ macro_rules! div { let a = (a ^ s_a) - s_a; let b = (b ^ s_b) - s_b; let s = s_a ^ s_b; + + if b == 0 { + unsafe { + intrinsics::abort() + } + } let r = (a as $uty) / (b as $uty); (r as $ty ^ s) - s } @@ -25,6 +33,12 @@ macro_rules! mod_ { let b = (b ^ s) - s; let s = a >> (<$ty>::bits() - 1); let a = (a ^ s) - s; + + if b == 0 { + unsafe { + intrinsics::abort() + } + } let r = (a as $uty) % (b as $uty); (r as $ty ^ s) - s } diff --git a/src/int/udiv.rs b/src/int/udiv.rs index 8a9da9f..bb1546c 100644 --- a/src/int/udiv.rs +++ b/src/int/udiv.rs @@ -109,6 +109,14 @@ pub extern "C" fn __udivmoddi4(n: u64, d: u64, rem: Option<&mut u64>) -> u64 { // 0 X // --- // 0 X + // NOTE This should be unreachable in safe Rust because the program will panic before + // this intrinsic is called + if d.low() == 0 { + unsafe { + intrinsics::abort() + } + } + if let Some(rem) = rem { *rem = u64::from(n.low() % d.low()); }