//@ add-minicore //@ revisions: all strong none safestack safestack_strong safestack_all //@ assembly-output: emit-asm //@ only-x86_64-unknown-linux-gnu //@ [all] compile-flags: -Z stack-protector=all //@ [strong] compile-flags: -Z stack-protector=strong //@ [none] compile-flags: -Z stack-protector=none //@ [safestack] compile-flags: -Z stack-protector=none -Z sanitizer=safestack //@ [safestack_strong] compile-flags: -Z stack-protector=strong -Z sanitizer=safestack //@ [safestack_all] compile-flags: -Z stack-protector=all -Z sanitizer=safestack //@ compile-flags: -C opt-level=2 -Z merge-functions=disabled --target x86_64-unknown-linux-gnu //@ needs-llvm-components: x86 #![feature(unsized_fn_params)] #![crate_type = "lib"] #![feature(no_core)] #![no_core] #![no_std] extern crate minicore; use minicore::*; extern "C" { fn test4spss(p: *mut u8); } // CHECK-LABEL: test1{{:|\[}} #[no_mangle] pub unsafe fn test1(x: *mut u8) -> u8 { let mut buf: [u8; 64] = [0; 64]; let p = &mut buf as *mut [u8; 64] as *mut u8; *p = 42; test4spss(p); *x = *p; *p // none-NOT: __stack_chk_fail // strong: __stack_chk_fail // all: __stack_chk_fail // safestack: __safestack_unsafe_stack_ptr // safestack-NOT: __stack_chk_fail // safestack_strong: __safestack_unsafe_stack_ptr // safestack_strong: __stack_chk_fail // safestack_all: __safestack_unsafe_stack_ptr // safestack_all: __stack_chk_fail }