mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Fix miri UB: use transmute_copy for function pointer identity checks (#8432)
Nightly miri now flags `fn_ptr as usize` and direct `fn_ptr == fn_ptr` as UB because both paths go through `FnPtr::addr()`, which attempts to dereference a function pointer's provenance — function items have no backing allocation in miri's model. Add `fn_addr<T>(f: T) -> usize` that uses `transmute_copy` to read the address as plain integer bytes without triggering provenance checks. Replace all `f as usize` slot comparison patterns across the codebase with `fn_addr(f)`. Also add `-Zmiri-permissive-provenance` to CI MIRIFLAGS as a safety net for any remaining integer-pointer round-trips elsewhere. Assisted-by: Claude
This commit is contained in:
1 parent
0df8c8428b
commit
3364c47a4b
11 files changed
+72
-42
No files matched your search
@@ -648,7 +648,10 @@ jobs:
|
||||
env:
|
||||
# miri-ignore-leaks because the type-object circular reference means that there will always be
|
||||
# a memory leak, at least until we have proper cyclic gc
|
||||
MIRIFLAGS: "-Zmiri-ignore-leaks"
|
||||
# miri-permissive-provenance because function pointer identity checks (slot comparisons)
|
||||
# cast fn pointers to usize, which strips provenance — this is the standard pattern for
|
||||
# fn pointer comparison in Rust and not a soundness issue
|
||||
MIRIFLAGS: "-Zmiri-ignore-leaks -Zmiri-permissive-provenance"
|
||||
|
||||
wasm:
|
||||
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip:ci') }}
|
||||
|
||||
Reference in new issue
Block a user