]> git.lizzy.rs Git - rust.git/blob - src/test/ui/abi/segfault-no-out-of-stack.rs
Rollup merge of #63539 - Centril:2015.await, r=oli-obk
[rust.git] / src / test / ui / abi / segfault-no-out-of-stack.rs
1 // run-pass
2
3 #![allow(unused_imports)]
4 // ignore-cloudabi can't run commands
5 // ignore-emscripten can't run commands
6 // ignore-sgx no processes
7
8 #![feature(rustc_private)]
9
10 extern crate libc;
11
12 use std::process::{Command, ExitStatus};
13 use std::env;
14
15 #[link(name = "rust_test_helpers", kind = "static")]
16 extern {
17     fn rust_get_null_ptr() -> *mut ::libc::c_char;
18 }
19
20 #[cfg(unix)]
21 fn check_status(status: std::process::ExitStatus)
22 {
23     use libc;
24     use std::os::unix::process::ExitStatusExt;
25
26     assert!(status.signal() == Some(libc::SIGSEGV)
27             || status.signal() == Some(libc::SIGBUS));
28 }
29
30 #[cfg(not(unix))]
31 fn check_status(status: std::process::ExitStatus)
32 {
33     assert!(!status.success());
34 }
35
36 fn main() {
37     let args: Vec<String> = env::args().collect();
38     if args.len() > 1 && args[1] == "segfault" {
39         unsafe { *rust_get_null_ptr() = 1; }; // trigger a segfault
40     } else {
41         let segfault = Command::new(&args[0]).arg("segfault").output().unwrap();
42         let stderr = String::from_utf8_lossy(&segfault.stderr);
43         let stdout = String::from_utf8_lossy(&segfault.stdout);
44         println!("stdout: {}", stdout);
45         println!("stderr: {}", stderr);
46         println!("status: {}", segfault.status);
47         check_status(segfault.status);
48         assert!(!stderr.contains("has overflowed its stack"));
49     }
50 }