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