#![crate_type = "cdylib"] #![crate_name = "foo"] use std::arch::asm; use std::ffi::{CStr, CString}; use std::os::raw::c_char; extern "C" { fn bar(ptr: *const c_char); } #[no_mangle] pub extern "C" fn foo(ptr: *const c_char) { assert_eq!((ptr as usize) >> 56, 0x1f); let s = unsafe { CStr::from_ptr(ptr) }; assert_eq!(s.to_str().unwrap(), "ab"); let s = CString::from_vec_with_nul("cd\0".into()).unwrap(); let mut p = ((s.as_ptr() as usize) | (0x2f << 56)) as *const c_char; unsafe { #[cfg(target_feature = "mte")] asm!("stg {p}, [{p}]", p = inout(reg) p); bar(p); } }