aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-06-09 12:46:22 +0100
committerGitHub <noreply@github.com>2025-06-09 12:46:22 +0100
commit87247b8bb787e53f7ca26fba1a11739844bf442d (patch)
tree2415eb49e48ab985237ca61211e42cf1a668f2a6 /base
parentb8ac7776494eb7c55828b11fa5a431ef2eb44197 (diff)
parentf8228a91d1823a2f586dcca5f5ff9f57d17dc92f (diff)
Merge pull request #5286 from Feoramund/no-san-mem
Add `@(no_sanitize_memory)` with additions to `base:sanitizer`
Diffstat (limited to 'base')
-rw-r--r--base/sanitizer/memory.odin74
1 files changed, 74 insertions, 0 deletions
diff --git a/base/sanitizer/memory.odin b/base/sanitizer/memory.odin
new file mode 100644
index 000000000..b16309a49
--- /dev/null
+++ b/base/sanitizer/memory.odin
@@ -0,0 +1,74 @@
+#+no-instrumentation
+package sanitizer
+
+@(private="file")
+MSAN_ENABLED :: .Memory in ODIN_SANITIZER_FLAGS
+
+@(private="file")
+@(default_calling_convention="system")
+foreign {
+ __msan_unpoison :: proc(addr: rawptr, size: uint) ---
+}
+
+/*
+Marks a slice as fully initialized.
+
+Code instrumented with `-sanitize:memory` will be permitted to access any
+address within the slice as if it had already been initialized.
+
+When msan is not enabled this procedure does nothing.
+*/
+memory_unpoison_slice :: proc "contextless" (region: $T/[]$E) {
+ when MSAN_ENABLED {
+ __msan_unpoison(raw_data(region), size_of(E) * len(region))
+ }
+}
+
+/*
+Marks a pointer as fully initialized.
+
+Code instrumented with `-sanitize:memory` will be permitted to access memory
+within the region the pointer points to as if it had already been initialized.
+
+When msan is not enabled this procedure does nothing.
+*/
+memory_unpoison_ptr :: proc "contextless" (ptr: ^$T) {
+ when MSAN_ENABLED {
+ __msan_unpoison(ptr, size_of(T))
+ }
+}
+
+/*
+Marks the region covering `[ptr, ptr+len)` as fully initialized.
+
+Code instrumented with `-sanitize:memory` will be permitted to access memory
+within this range as if it had already been initialized.
+
+When msan is not enabled this procedure does nothing.
+*/
+memory_unpoison_rawptr :: proc "contextless" (ptr: rawptr, len: int) {
+ when MSAN_ENABLED {
+ __msan_unpoison(ptr, uint(len))
+ }
+}
+
+/*
+Marks the region covering `[ptr, ptr+len)` as fully initialized.
+
+Code instrumented with `-sanitize:memory` will be permitted to access memory
+within this range as if it had already been initialized.
+
+When msan is not enabled this procedure does nothing.
+*/
+memory_unpoison_rawptr_uint :: proc "contextless" (ptr: rawptr, len: uint) {
+ when MSAN_ENABLED {
+ __msan_unpoison(ptr, len)
+ }
+}
+
+memory_unpoison :: proc {
+ memory_unpoison_slice,
+ memory_unpoison_ptr,
+ memory_unpoison_rawptr,
+ memory_unpoison_rawptr_uint,
+}