summaryrefslogtreecommitdiff
path: root/src/tools/miri/tests/pass-dep/shims/libc-misc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/miri/tests/pass-dep/shims/libc-misc.rs')
-rw-r--r--src/tools/miri/tests/pass-dep/shims/libc-misc.rs102
1 files changed, 100 insertions, 2 deletions
diff --git a/src/tools/miri/tests/pass-dep/shims/libc-misc.rs b/src/tools/miri/tests/pass-dep/shims/libc-misc.rs
index 98e1c3a0adb..68504cb1c79 100644
--- a/src/tools/miri/tests/pass-dep/shims/libc-misc.rs
+++ b/src/tools/miri/tests/pass-dep/shims/libc-misc.rs
@@ -90,7 +90,7 @@ fn test_posix_realpath_errors() {
use std::ffi::CString;
use std::io::ErrorKind;
- // Test non-existent path returns an error.
+ // Test nonexistent path returns an error.
let c_path = CString::new("./nothing_to_see_here").expect("CString::new failed");
let r = unsafe { libc::realpath(c_path.as_ptr(), std::ptr::null_mut()) };
assert!(r.is_null());
@@ -101,7 +101,6 @@ fn test_posix_realpath_errors() {
#[cfg(target_os = "linux")]
fn test_posix_fadvise() {
- use std::convert::TryInto;
use std::io::Write;
let path = tmp().join("miri_test_libc_posix_fadvise.txt");
@@ -302,6 +301,101 @@ fn test_posix_mkstemp() {
}
}
+fn test_memcpy() {
+ unsafe {
+ let src = [1i8, 2, 3];
+ let dest = libc::calloc(3, 1);
+ libc::memcpy(dest, src.as_ptr() as *const libc::c_void, 3);
+ let slc = std::slice::from_raw_parts(dest as *const i8, 3);
+ assert_eq!(*slc, [1i8, 2, 3]);
+ libc::free(dest);
+ }
+
+ unsafe {
+ let src = [1i8, 2, 3];
+ let dest = libc::calloc(4, 1);
+ libc::memcpy(dest, src.as_ptr() as *const libc::c_void, 3);
+ let slc = std::slice::from_raw_parts(dest as *const i8, 4);
+ assert_eq!(*slc, [1i8, 2, 3, 0]);
+ libc::free(dest);
+ }
+
+ unsafe {
+ let src = 123_i32;
+ let mut dest = 0_i32;
+ libc::memcpy(
+ &mut dest as *mut i32 as *mut libc::c_void,
+ &src as *const i32 as *const libc::c_void,
+ std::mem::size_of::<i32>(),
+ );
+ assert_eq!(dest, src);
+ }
+
+ unsafe {
+ let src = Some(123);
+ let mut dest: Option<i32> = None;
+ libc::memcpy(
+ &mut dest as *mut Option<i32> as *mut libc::c_void,
+ &src as *const Option<i32> as *const libc::c_void,
+ std::mem::size_of::<Option<i32>>(),
+ );
+ assert_eq!(dest, src);
+ }
+
+ unsafe {
+ let src = &123;
+ let mut dest = &42;
+ libc::memcpy(
+ &mut dest as *mut &'static i32 as *mut libc::c_void,
+ &src as *const &'static i32 as *const libc::c_void,
+ std::mem::size_of::<&'static i32>(),
+ );
+ assert_eq!(*dest, 123);
+ }
+}
+
+fn test_strcpy() {
+ use std::ffi::{CStr, CString};
+
+ // case: src_size equals dest_size
+ unsafe {
+ let src = CString::new("rust").unwrap();
+ let size = src.as_bytes_with_nul().len();
+ let dest = libc::malloc(size);
+ libc::strcpy(dest as *mut libc::c_char, src.as_ptr());
+ assert_eq!(CStr::from_ptr(dest as *const libc::c_char), src.as_ref());
+ libc::free(dest);
+ }
+
+ // case: src_size is less than dest_size
+ unsafe {
+ let src = CString::new("rust").unwrap();
+ let size = src.as_bytes_with_nul().len();
+ let dest = libc::malloc(size + 1);
+ libc::strcpy(dest as *mut libc::c_char, src.as_ptr());
+ assert_eq!(CStr::from_ptr(dest as *const libc::c_char), src.as_ref());
+ libc::free(dest);
+ }
+}
+
+#[cfg(target_os = "linux")]
+fn test_sigrt() {
+ let min = libc::SIGRTMIN();
+ let max = libc::SIGRTMAX();
+
+ // "The Linux kernel supports a range of 33 different real-time
+ // signals, numbered 32 to 64"
+ assert!(min >= 32);
+ assert!(max >= 32);
+ assert!(min <= 64);
+ assert!(max <= 64);
+
+ // "POSIX.1-2001 requires that an implementation support at least
+ // _POSIX_RTSIG_MAX (8) real-time signals."
+ assert!(min < max);
+ assert!(max - min >= 8)
+}
+
fn main() {
test_posix_gettimeofday();
test_posix_mkstemp();
@@ -315,9 +409,13 @@ fn main() {
test_isatty();
test_clocks();
+ test_memcpy();
+ test_strcpy();
+
#[cfg(target_os = "linux")]
{
test_posix_fadvise();
test_sync_file_range();
+ test_sigrt();
}
}