Jelajahi Sumber

insert more `abort()` calls where division by zero may occur

Jorge Aparicio 8 tahun lalu
induk
melakukan
a21fb956f9
2 mengubah file dengan 22 tambahan dan 0 penghapusan
  1. 14 0
      src/int/sdiv.rs
  2. 8 0
      src/int/udiv.rs

+ 14 - 0
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
         }

+ 8 - 0
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());
             }