]> git.lizzy.rs Git - rust.git/commitdiff
review failing compile-fail tests
authorRalf Jung <post@ralfj.de>
Tue, 23 Jul 2019 21:25:06 +0000 (23:25 +0200)
committerRalf Jung <post@ralfj.de>
Tue, 23 Jul 2019 21:25:06 +0000 (23:25 +0200)
22 files changed:
tests/compile-fail/bitop-beyond-alignment.rs [deleted file]
tests/compile-fail/cast_box_int_to_fn_ptr.rs
tests/compile-fail/cast_int_to_fn_ptr.rs
tests/compile-fail/getrandom.rs [deleted file]
tests/compile-fail/pointer_byte_read.rs [new file with mode: 0644]
tests/compile-fail/pointer_byte_read_1.rs [deleted file]
tests/compile-fail/pointer_byte_read_2.rs [deleted file]
tests/compile-fail/ptr_bitops1.rs [deleted file]
tests/compile-fail/ptr_bitops2.rs [deleted file]
tests/compile-fail/ptr_eq_dangling.rs [deleted file]
tests/compile-fail/ptr_eq_integer.rs [deleted file]
tests/compile-fail/ptr_eq_out_of_bounds.rs [deleted file]
tests/compile-fail/ptr_eq_out_of_bounds_null.rs [deleted file]
tests/compile-fail/ptr_int_cast.rs [deleted file]
tests/compile-fail/ptr_offset_int_plus_int.rs
tests/compile-fail/ptr_offset_int_plus_ptr.rs
tests/compile-fail/ptr_rem.rs [deleted file]
tests/compile-fail/ptr_wrapping_offset_int_plus_ptr.rs [deleted file]
tests/compile-fail/validity/dangling_ref1.rs
tests/compile-fail/wild_pointer_deref.rs
tests/run-pass/bitop-beyond-alignment.rs [new file with mode: 0644]
tests/run-pass/intptrcast.rs

diff --git a/tests/compile-fail/bitop-beyond-alignment.rs b/tests/compile-fail/bitop-beyond-alignment.rs
deleted file mode 100644 (file)
index a30c054..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![allow(dead_code)]
-
-use std::mem;
-
-enum Tag<A> {
-    Tag2(A)
-}
-
-struct Rec {
-    c8: u8,
-    t: Tag<u64>
-}
-
-fn mk_rec() -> Rec {
-    return Rec { c8:0, t:Tag::Tag2(0) };
-}
-
-fn is_u64_aligned(u: &Tag<u64>) -> bool {
-    let p: usize = unsafe { mem::transmute(u) };
-    let u64_align = std::mem::align_of::<u64>();
-    return (p & (u64_align + 1)) == 0; //~ ERROR a raw memory access tried to access part of a pointer value as raw bytes
-}
-
-pub fn main() {
-    let x = mk_rec();
-    assert!(is_u64_aligned(&x.t));
-}
index 7ee3bc62767fb4f2076ffecbb9a209f2a43bf71f..6dad2a4727306f2bdf33e4e7e5b8719ac72240cc 100644 (file)
@@ -4,8 +4,8 @@
 fn main() {
     let b = Box::new(42);
     let g = unsafe {
-        std::mem::transmute::<&usize, &fn(i32)>(&b)
+        std::mem::transmute::<&Box<usize>, &fn(i32)>(&b)
     };
 
-    (*g)(42) //~ ERROR a memory access tried to interpret some bytes as a pointer
+    (*g)(42) //~ ERROR tried to treat a memory pointer as a function pointer
 }
index 207af4ae2cefb45a9e719f997671af2b7e961bfe..4fd14751a279a38921665409efdf033f6041a4b4 100644 (file)
@@ -6,5 +6,5 @@ fn main() {
         std::mem::transmute::<usize, fn(i32)>(42)
     };
 
-    g(42) //~ ERROR a memory access tried to interpret some bytes as a pointer
+    g(42) //~ ERROR dangling pointer was dereferenced
 }
diff --git a/tests/compile-fail/getrandom.rs b/tests/compile-fail/getrandom.rs
deleted file mode 100644 (file)
index 246893a..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// ignore-macos: Uses Linux-only APIs
-// ignore-windows: Uses Linux-only APIs
-
-#![feature(rustc_private)]
-extern crate libc;
-
-fn main() {
-    let mut buf = [0u8; 5];
-    unsafe {
-        libc::syscall(libc::SYS_getrandom, buf.as_mut_ptr() as *mut libc::c_void, 5 as libc::size_t, 0 as libc::c_uint);
-        //~^ ERROR miri does not support gathering system entropy in deterministic mode!
-    }
-}
diff --git a/tests/compile-fail/pointer_byte_read.rs b/tests/compile-fail/pointer_byte_read.rs
new file mode 100644 (file)
index 0000000..ddb9bc1
--- /dev/null
@@ -0,0 +1,7 @@
+fn main() {
+    let x = 13;
+    let y = &x;
+    let z = &y as *const &i32 as *const u8;
+    // the deref fails, because we are reading only a part of the pointer
+    let _val = unsafe { *z }; //~ ERROR tried to access part of a pointer value as raw bytes
+}
diff --git a/tests/compile-fail/pointer_byte_read_1.rs b/tests/compile-fail/pointer_byte_read_1.rs
deleted file mode 100644 (file)
index a584863..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-fn main() {
-    let x = 13;
-    let y = &x;
-    let z = &y as *const &i32 as *const usize;
-    let ptr_bytes = unsafe { *z }; // the actual deref is fine, because we read the entire pointer at once
-    let _val = ptr_bytes / 432; //~ ERROR invalid arithmetic on pointers that would leak base addresses
-}
diff --git a/tests/compile-fail/pointer_byte_read_2.rs b/tests/compile-fail/pointer_byte_read_2.rs
deleted file mode 100644 (file)
index ddb9bc1..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-fn main() {
-    let x = 13;
-    let y = &x;
-    let z = &y as *const &i32 as *const u8;
-    // the deref fails, because we are reading only a part of the pointer
-    let _val = unsafe { *z }; //~ ERROR tried to access part of a pointer value as raw bytes
-}
diff --git a/tests/compile-fail/ptr_bitops1.rs b/tests/compile-fail/ptr_bitops1.rs
deleted file mode 100644 (file)
index 2706b09..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-fn main() {
-    let bytes = [0i8, 1, 2, 3, 4, 5, 6, 7, 8, 9];
-    let one = bytes.as_ptr().wrapping_offset(1);
-    let three = bytes.as_ptr().wrapping_offset(3);
-    let res = (one as usize) | (three as usize); //~ ERROR invalid arithmetic on pointers that would leak base addresses
-    println!("{}", res);
-}
diff --git a/tests/compile-fail/ptr_bitops2.rs b/tests/compile-fail/ptr_bitops2.rs
deleted file mode 100644 (file)
index 5d5eab1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-fn main() {
-    let val = 13usize;
-    let addr = &val as *const _ as usize;
-    let _val = addr & 13; //~ ERROR access part of a pointer value as raw bytes
-}
diff --git a/tests/compile-fail/ptr_eq_dangling.rs b/tests/compile-fail/ptr_eq_dangling.rs
deleted file mode 100644 (file)
index 5badf09..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-fn main() {
-    let b = Box::new(0);
-    let x = &*b as *const i32; // soon-to-be dangling
-    drop(b);
-    let b = Box::new(0);
-    let y = &*b as *const i32; // different allocation
-    // We cannot compare these even though both are inbounds -- they *could* be
-    // equal if memory was reused.
-    assert!(x != y); //~ ERROR invalid arithmetic on pointers
-}
diff --git a/tests/compile-fail/ptr_eq_integer.rs b/tests/compile-fail/ptr_eq_integer.rs
deleted file mode 100644 (file)
index 396abaf..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-fn main() {
-    let b = Box::new(0);
-    let x = &*b as *const i32;
-    // We cannot compare this with a non-NULL integer. After all, these *could* be equal (with the right base address).
-    assert!(x != 64 as *const i32); //~ ERROR invalid arithmetic on pointers
-}
diff --git a/tests/compile-fail/ptr_eq_out_of_bounds.rs b/tests/compile-fail/ptr_eq_out_of_bounds.rs
deleted file mode 100644 (file)
index 7efa446..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-fn main() {
-    let b = Box::new(0);
-    let x = (&*b as *const i32).wrapping_sub(0x800); // out-of-bounds
-    let b = Box::new(0);
-    let y = &*b as *const i32; // different allocation
-    // We cannot compare these even though both allocations are live -- they *could* be
-    // equal (with the right base addresses).
-    assert!(x != y); //~ ERROR invalid arithmetic on pointers
-}
diff --git a/tests/compile-fail/ptr_eq_out_of_bounds_null.rs b/tests/compile-fail/ptr_eq_out_of_bounds_null.rs
deleted file mode 100644 (file)
index 3b7b51f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-fn main() {
-    let b = Box::new(0);
-    let x = (&*b as *const i32).wrapping_sub(0x800); // out-of-bounds
-    // We cannot compare this with NULL. After all, this *could* be NULL (with the right base address).
-    assert!(x != std::ptr::null()); //~ ERROR invalid arithmetic on pointers
-}
diff --git a/tests/compile-fail/ptr_int_cast.rs b/tests/compile-fail/ptr_int_cast.rs
deleted file mode 100644 (file)
index a823a0f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-fn main() {
-    let x = &1;
-    // Casting down to u8 and back up to a pointer loses too much precision; this must not work.
-    let x = x as *const i32;
-    let x = x as u8; //~ ERROR a raw memory access tried to access part of a pointer value as raw bytes
-    let x = x as *const i32;
-    let _val = unsafe { *x };
-}
index 2d3282a0a97a0c95c72d355de2aacba96e76c89d..051874696b11629fa8678adeb791f5fba13406cb 100644 (file)
@@ -1,4 +1,4 @@
-// error-pattern: tried to interpret some bytes as a pointer
+// error-pattern: dangling pointer was dereferenced
 
 fn main() {
     // Can't offset an integer pointer by non-zero offset.
index b49c758c72f786404ec2fb4390db3eb8cd043ccc..bd90d06909177a3aabf19fe4083c796c9e71bebb 100644 (file)
@@ -1,4 +1,4 @@
-// error-pattern: pointer value as raw bytes
+// error-pattern: dangling pointer was dereferenced
 
 fn main() {
     let ptr = Box::into_raw(Box::new(0u32));
diff --git a/tests/compile-fail/ptr_rem.rs b/tests/compile-fail/ptr_rem.rs
deleted file mode 100644 (file)
index dfc91e9..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-fn main() {
-    let val = 13usize;
-    let addr = &val as *const _ as usize;
-    let _val = addr % 16; //~ ERROR access part of a pointer value as raw bytes
-}
diff --git a/tests/compile-fail/ptr_wrapping_offset_int_plus_ptr.rs b/tests/compile-fail/ptr_wrapping_offset_int_plus_ptr.rs
deleted file mode 100644 (file)
index eacb9f0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// error-pattern: pointer value as raw bytes
-
-fn main() {
-    let ptr = Box::into_raw(Box::new(0u32));
-    // Can't start with an integer pointer and get to something usable
-    let ptr = (1 as *mut u8).wrapping_offset(ptr as isize);
-    let _val = unsafe { *ptr };
-}
index 2c1984b7159ce7c68184501650db1bd6231d23c7..194445b1ad7e1758a0be54b0ee42ed98b1f53b1e 100644 (file)
@@ -1,5 +1,5 @@
 use std::mem;
 
 fn main() {
-    let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR dangling reference (created from integer)
+    let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR dangling reference (not entirely in bounds)
 }
index 8eec9737546b308a3c92d7a0b97f0821952c8552..ae32f7d5562bde9bb890b3ce18ae94a89baaf067 100644 (file)
@@ -1,5 +1,5 @@
 fn main() {
     let p = 44 as *const i32;
-    let x = unsafe { *p }; //~ ERROR a memory access tried to interpret some bytes as a pointer
+    let x = unsafe { *p }; //~ ERROR dangling pointer was dereferenced
     panic!("this should never print: {}", x);
 }
diff --git a/tests/run-pass/bitop-beyond-alignment.rs b/tests/run-pass/bitop-beyond-alignment.rs
new file mode 100644 (file)
index 0000000..f7bf7f9
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(dead_code)]
+
+use std::mem;
+
+enum Tag<A> {
+    Tag2(A)
+}
+
+struct Rec {
+    c8: u8,
+    t: Tag<u64>
+}
+
+fn mk_rec() -> Rec {
+    return Rec { c8:0, t:Tag::Tag2(0) };
+}
+
+fn is_u64_aligned(u: &Tag<u64>) -> bool {
+    let p: usize = unsafe { mem::transmute(u) };
+    let u64_align = std::mem::align_of::<u64>();
+    return (p & (u64_align + 1)) == 0;
+}
+
+pub fn main() {
+    let x = mk_rec();
+    assert!(is_u64_aligned(&x.t));
+}
index c28958b872de2c28570a0e3969179b17981ed105..c2711f9845d0f4bb2e30f5cdd48bd5ebcbd283b9 100644 (file)
@@ -3,18 +3,22 @@ fn transmute_ptr_to_int<T>(x: *const T) -> usize {
     unsafe { std::mem::transmute(x) }
 }
 
-fn main() {
+fn cast() {
     // Some casting-to-int with arithmetic.
     let x = &42 as *const i32 as usize;
     let y = x * 2;
     assert_eq!(y, x + x);
     let z = y as u8 as usize;
     assert_eq!(z, y % 256);
+}
 
+fn format() {
     // Pointer string formatting! We can't check the output as it changes when libstd changes,
     // but we can make sure Miri does not error.
     format!("{:?}", &mut 13 as *mut _);
+}
 
+fn transmute() {
     // Check that intptrcast is triggered for explicit casts and that it is consistent with
     // transmuting.
     let a: *const i32 = &42;
@@ -22,3 +26,64 @@ fn main() {
     let c = a as usize as u8;
     assert_eq!(b, c);
 }
+
+fn ptr_bitops1() {
+    let bytes = [0i8, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+    let one = bytes.as_ptr().wrapping_offset(1);
+    let three = bytes.as_ptr().wrapping_offset(3);
+    let res = (one as usize) | (three as usize);
+    format!("{}", res);
+}
+
+fn ptr_bitops2() {
+    let val = 13usize;
+    let addr = &val as *const _ as usize;
+    let _val = addr & 13;
+}
+
+fn ptr_eq_dangling() {
+    let b = Box::new(0);
+    let x = &*b as *const i32; // soon-to-be dangling
+    drop(b);
+    let b = Box::new(0);
+    let y = &*b as *const i32; // different allocation
+    // We cannot compare these even though both are inbounds -- they *could* be
+    // equal if memory was reused.
+    assert!(x != y);
+}
+
+fn ptr_eq_out_of_bounds() {
+    let b = Box::new(0);
+    let x = (&*b as *const i32).wrapping_sub(0x800); // out-of-bounds
+    let b = Box::new(0);
+    let y = &*b as *const i32; // different allocation
+    // We cannot compare these even though both allocations are live -- they *could* be
+    // equal (with the right base addresses).
+    assert!(x != y);
+}
+
+fn ptr_eq_out_of_bounds_null() {
+    let b = Box::new(0);
+    let x = (&*b as *const i32).wrapping_sub(0x800); // out-of-bounds
+    // We cannot compare this with NULL. After all, this *could* be NULL (with the right base address).
+    assert!(x != std::ptr::null());
+}
+
+fn ptr_eq_integer() {
+    let b = Box::new(0);
+    let x = &*b as *const i32;
+    // We cannot compare this with a non-NULL integer. After all, these *could* be equal (with the right base address).
+    assert!(x != 64 as *const i32);
+}
+
+fn main() {
+    cast();
+    format();
+    transmute();
+    ptr_bitops1();
+    ptr_bitops2();
+    ptr_eq_dangling();
+    ptr_eq_out_of_bounds();
+    ptr_eq_out_of_bounds_null();
+    ptr_eq_integer();
+}