diff options
| author | Strophox <strophox@gmail.com> | 2024-07-31 09:41:14 +0200 |
|---|---|---|
| committer | Strophox <strophox@gmail.com> | 2024-08-30 16:05:53 +0200 |
| commit | 7fde02ea53f423ca25740e9339d8ff1db8f73052 (patch) | |
| tree | 1f18dae519856ff8d3a2b24ba24889ce7adb2b9d /src/tools/miri/tests/native-lib | |
| parent | 748c54848dc2964b7e133f945cabe5bc64079947 (diff) | |
enable Miri to pass const pointers through FFI
Co-authored-by: Ralf Jung <post@ralfj.de>
Diffstat (limited to 'src/tools/miri/tests/native-lib')
| -rw-r--r-- | src/tools/miri/tests/native-lib/native-lib.map (renamed from src/tools/miri/tests/native-lib/libtest.map) | 8 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/pass/ptr_read_access.rs | 82 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/pass/ptr_read_access.stdout | 1 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/pass/scalar_arguments.rs (renamed from src/tools/miri/tests/native-lib/pass/call_extern_c_fn.rs) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/pass/scalar_arguments.stdout (renamed from src/tools/miri/tests/native-lib/pass/call_extern_c_fn.stdout) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/ptr_read_access.c | 47 | ||||
| -rw-r--r-- | src/tools/miri/tests/native-lib/scalar_arguments.c (renamed from src/tools/miri/tests/native-lib/test.c) | 0 |
7 files changed, 138 insertions, 0 deletions
diff --git a/src/tools/miri/tests/native-lib/libtest.map b/src/tools/miri/tests/native-lib/native-lib.map index a57a4dc149f..7e3bd19622a 100644 --- a/src/tools/miri/tests/native-lib/libtest.map +++ b/src/tools/miri/tests/native-lib/native-lib.map @@ -1,12 +1,20 @@ CODEABI_1.0 { # Define which symbols to export. global: + # scalar_arguments.c add_one_int; printer; test_stack_spill; get_unsigned_int; add_int16; add_short_to_long; + + # ptr_read_access.c + print_pointer; + access_simple; + access_nested; + access_static; + # The rest remains private. local: *; }; diff --git a/src/tools/miri/tests/native-lib/pass/ptr_read_access.rs b/src/tools/miri/tests/native-lib/pass/ptr_read_access.rs new file mode 100644 index 00000000000..d8e6209839e --- /dev/null +++ b/src/tools/miri/tests/native-lib/pass/ptr_read_access.rs @@ -0,0 +1,82 @@ +//@only-target-linux +//@only-on-host + +fn main() { + test_pointer(); + + test_simple(); + + test_nested(); + + test_static(); +} + +// Test void function that dereferences a pointer and prints its contents from C. +fn test_pointer() { + extern "C" { + fn print_pointer(ptr: *const i32); + } + + let x = 42; + + unsafe { print_pointer(&x) }; +} + +// Test function that dereferences a simple struct pointer and accesses a field. +fn test_simple() { + #[repr(C)] + struct Simple { + field: i32 + } + + extern "C" { + fn access_simple(s_ptr: *const Simple) -> i32; + } + + let simple = Simple { field: -42 }; + + assert_eq!(unsafe { access_simple(&simple) }, -42); +} + +// Test function that dereferences nested struct pointers and accesses fields. +fn test_nested() { + use std::ptr::NonNull; + + #[derive(Debug, PartialEq, Eq)] + #[repr(C)] + struct Nested { + value: i32, + next: Option<NonNull<Nested>>, + } + + extern "C" { + fn access_nested(n_ptr: *const Nested) -> i32; + } + + let mut nested_0 = Nested { value: 97, next: None }; + let mut nested_1 = Nested { value: 98, next: NonNull::new(&mut nested_0) }; + let nested_2 = Nested { value: 99, next: NonNull::new(&mut nested_1) }; + + assert_eq!(unsafe { access_nested(&nested_2) }, 97); +} + +// Test function that dereferences static struct pointers and accesses fields. +fn test_static() { + + #[repr(C)] + struct Static { + value: i32, + recurse: &'static Static, + } + + extern "C" { + fn access_static(n_ptr: *const Static) -> i32; + } + + static STATIC: Static = Static { + value: 9001, + recurse: &STATIC, + }; + + assert_eq!(unsafe { access_static(&STATIC) }, 9001); +} diff --git a/src/tools/miri/tests/native-lib/pass/ptr_read_access.stdout b/src/tools/miri/tests/native-lib/pass/ptr_read_access.stdout new file mode 100644 index 00000000000..1a8799abfc9 --- /dev/null +++ b/src/tools/miri/tests/native-lib/pass/ptr_read_access.stdout @@ -0,0 +1 @@ +printing pointer dereference from C: 42 diff --git a/src/tools/miri/tests/native-lib/pass/call_extern_c_fn.rs b/src/tools/miri/tests/native-lib/pass/scalar_arguments.rs index 1e1d0b11e99..1e1d0b11e99 100644 --- a/src/tools/miri/tests/native-lib/pass/call_extern_c_fn.rs +++ b/src/tools/miri/tests/native-lib/pass/scalar_arguments.rs diff --git a/src/tools/miri/tests/native-lib/pass/call_extern_c_fn.stdout b/src/tools/miri/tests/native-lib/pass/scalar_arguments.stdout index 7ba13d2d7b0..7ba13d2d7b0 100644 --- a/src/tools/miri/tests/native-lib/pass/call_extern_c_fn.stdout +++ b/src/tools/miri/tests/native-lib/pass/scalar_arguments.stdout diff --git a/src/tools/miri/tests/native-lib/ptr_read_access.c b/src/tools/miri/tests/native-lib/ptr_read_access.c new file mode 100644 index 00000000000..03b9189e2e8 --- /dev/null +++ b/src/tools/miri/tests/native-lib/ptr_read_access.c @@ -0,0 +1,47 @@ +#include <stdio.h> + +/* Test: test_pointer */ + +void print_pointer(const int *ptr) { + printf("printing pointer dereference from C: %d\n", *ptr); +} + +/* Test: test_simple */ + +typedef struct Simple { + int field; +} Simple; + +int access_simple(const Simple *s_ptr) { + return s_ptr->field; +} + +/* Test: test_nested */ + +typedef struct Nested { + int value; + struct Nested *next; +} Nested; + +// Returns the innermost/last value of a Nested pointer chain. +int access_nested(const Nested *n_ptr) { + // Edge case: `n_ptr == NULL` (i.e. first Nested is None). + if (!n_ptr) { return 0; } + + while (n_ptr->next) { + n_ptr = n_ptr->next; + } + + return n_ptr->value; +} + +/* Test: test_static */ + +typedef struct Static { + int value; + struct Static *recurse; +} Static; + +int access_static(const Static *s_ptr) { + return s_ptr->recurse->recurse->value; +} diff --git a/src/tools/miri/tests/native-lib/test.c b/src/tools/miri/tests/native-lib/scalar_arguments.c index 68714f1743b..68714f1743b 100644 --- a/src/tools/miri/tests/native-lib/test.c +++ b/src/tools/miri/tests/native-lib/scalar_arguments.c |
