Skip to content

[3.12] Crash of repeated Programs/_testembed.c on Windows DEBUG build #128833

Closed

Description

@picnixz

Bug report

Bug description:

This is an issue that only affects Windows DEBUG builds and Python 3.12. I discovered it while writing #127780 and @Yhg1s (#127780 (comment)) investigated it more in details.

The reproducer is as follows:

PS D:\Python\cpython> D:\\Python\\cpython\\PCbuild\\amd64\\_testembed_d.exe test_repeated_init_exec 'import dis
>> import importlib._bootstrap
>> import opcode
>> import test.test_dis
>>
>> def is_specialized(f):
>>     for instruction in dis.get_instructions(f, adaptive=True):
>>         opname = instruction.opname
>>         if (
>>             opname in opcode._specialized_instructions
>>             # Exclude superinstructions:
>>             and \"__\" not in opname
>>         ):
>>             return True
>>     return False
>>
>> func = importlib._bootstrap._handle_fromlist
>>
>> # "copy" the code to un-specialize it:
>> func.__code__ = func.__code__.replace()
>>
>> assert not is_specialized(func), \"specialized instructions found\"
>>
>> for i in range(test.test_dis.ADAPTIVE_WARMUP_DELAY):
>>     func(importlib._bootstrap, [\"x\"], lambda *args: None)
>>
>> assert is_specialized(func), \"no specialized instructions found\"
>>
>> print(\"Tests passed\")'
--- Loop #1 ---
Tests passed
--- Loop #2 ---
Assertion failed: PyUnicode_CheckExact(ep->me_key), file D:\Python\cpython\Objects\dictobject.c, line 939

Paraphrasing Thomas, the assertion failure happens only the second time, namely after finalizing and reinitializing, and the ep the assertion fails on is a deallocated object. We suspect that something isn't refcounted correctly, isn't marked as immortal when it should be, or isn't recreated on interpreter starutp when it should be. However, we don't why the issue does not appear on Linux.

According to Thomas, this is likely an issue with repeated calls to Py_Finalize and Py_Initialize. However, since 3.12 and 3.13 manage objects lifetime quite differently, it might be easier to just patch the test currently failing as follows: 68a33f3.

CPython versions tested on:

3.12

Operating systems tested on:

Windows, Linux

Linked PRs

Activity

  1. added
    3.12only security fixes
    interpreter-core(Objects, Python, Grammar, and Parser dirs)
    type-bugAn unexpected behavior, bug, or error
    type-crashA hard crash of the interpreter, possibly with a core dump
    on Jan 14, 2025
  2. changed the title [-][3.12] Crash of `Programs/_testembed.c` on Windows DEBUG build[/-] [+][3.12] Crash of repeated `Programs/_testembed.c` on Windows DEBUG build[/+] on Jan 14, 2025
  3. added a commit that references this issue on Jan 15, 2025
  4. ZeroIntensity commented on Jan 28, 2025

    @ZeroIntensity
    Member

    Triaging: is everything done here?

  5. picnixz commented on Jan 28, 2025

    @picnixz
    MemberAuthor

    No, the root cause is still not explained perfectly and we still have no perfect fix. My patch seems to work but we don't really know why it works. I'm keeping it open unless we decide to just ignore that issue =/

  6. vstinner commented on Jan 29, 2025

    @vstinner
    Member

    Operating systems tested on: Windows, Linux

    I cannot reproduce the bug on the current 3.12 branch on Linux with Python built in debug mode.

  7. picnixz commented on Jan 29, 2025

    @picnixz
    MemberAuthor

    On Linux there was no issue IIRC but we tested on both and observed that this failed on Windows 3.12 but maybe it works now?

  8. picnixz commented on Mar 24, 2025

    @picnixz
    MemberAuthor

    Since 3.12 is nearing its last bug fix, and since we didn't have time to investigate, let's close this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.12only security fixesOS-windowsinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errortype-crashA hard crash of the interpreter, possibly with a core dump

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions