← index #18169Issue #18167
Related · high · value 0.338
QUERY · ISSUE

Viper: ptr8(0)[0] = 1 causes SIGSEGV on unix port

openby MaksimFengopened 2025-09-29updated 2026-03-20
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

openby MaksimFengopened 2025-09-29updated 2025-09-30
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

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied