about summary refs log tree commit diff
path: root/src/tools/miri/tests/native-lib
diff options
context:
space:
mode:
authorStrophox <strophox@gmail.com>2024-07-31 09:41:14 +0200
committerStrophox <strophox@gmail.com>2024-08-30 16:05:53 +0200
commit7fde02ea53f423ca25740e9339d8ff1db8f73052 (patch)
tree1f18dae519856ff8d3a2b24ba24889ce7adb2b9d /src/tools/miri/tests/native-lib
parent748c54848dc2964b7e133f945cabe5bc64079947 (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.rs82
-rw-r--r--src/tools/miri/tests/native-lib/pass/ptr_read_access.stdout1
-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.c47
-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