QUERY · ISSUE
Viper: ptr8(0)[0] = 1 causes SIGSEGV on unix port
bugproposed-close
Port, board and/or hardware
Unix
MicroPython version
MicroPython v1.27.0-preview.107.gd1607598f on 2025-09-09; linux [GCC 14.2.0] version
Reproduction
try:
import micropython
except ImportError:
print("SKIP missing micropython")
else:
try:
@micropython.viper
def poke0():
p = ptr8(0)
p[0] = 1
try:
poke0()
print("should not reach here")
except Exception as e:
print("EXC", type(e).__name__)
except AttributeError:
print("SKIP viper_not_available")
Expected behaviour
it would be helpful if either:
- Viper rejected obviously invalid addresses like 0 (and perhaps addr + size overflow) with a Python exception in a debug/safe build mode, or
- The docs explicitly call out that such code will crash the process.
Observed behaviour
The process crashes with SIGSEGV at the generated Viper instruction
[#0] 0x7ffff7fba051 → mov BYTE PTR [rbx], dl
[#1] 0x7ffff7e27f40 → rex.WX sbb rax, QWORD PTR [rax]
[#2] 0x5555555f39e4 → mp_cstack_usage()
[#3] 0x7ffff7e27b60 → rcr ch, 1
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree
CANDIDATE · ISSUE
uctypes.bytes_at() accepts out-of-range (non-canonical) address and segfaults
bug
Port, board and/or hardware
Unix port
MicroPython version
MicroPython v1.27.0-preview.107.gd1607598f on 2025-09-09; linux [GCC 14.2.0] version
Reproduction
A Python-level exception when the address is obviously invalid, e.g.:
- ValueError/OverflowError for negative/out-of-range addresses, or
- OSError if the runtime chooses to probe and detect unreadable memory on the unix port.
At minimum, reject negative addresses and detect addr + size overflow to avoid trivial VM crashes.
Expected behaviour
import uctypes
ptr = 1 << 48
arr = uctypes.bytes_at(ptr, 8)
print('READ', arr)
Observed behaviour
Program received signal SIGSEGV, Segmentation fault.
#0 qstr_compute_hash(data=0x1000000000000, len=0x8)
#1 mp_obj_new_str_copy(type=mp_type_bytes, data=0x1000000000000, len=0x8)
#2 mp_obj_new_bytes(...)
#3 uctypes_struct_bytes_at(ptr=0x1000000000000, size=0x8)
#4 fun_builtin_2_call(...)
#5 mp_call_function_n_kw(...)
#6 mp_execute_bytecode(...)
...
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree