python / python/cpython

LeakSanitizer detects memory leaks in test_import with _testsinglephase module in subinterpreter

Offen
#140,404 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

pending tests topic-subinterpreters type-bug
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
36k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug report

Bug description:

LeakSanitizer detects memory leaks when running test_import with the _testsinglephase module loaded in a subinterpreter.

How to Reproduce

Build:

CC=clang CXX=clang++ ./configure --disable-optimizations --with-pydebug --with-address-sanitizer && make -j$(nproc)

Run:

./python -X dev -X showrefcount -m test test_import -j0
Leak Summary
==643791==ERROR: LeakSanitizer: detected memory leaks
SUMMARY: AddressSanitizer: 6709 byte(s) leaked in 45 allocation(s).
Code Locations

The leaks originate from:

Subinterpreter execution:

Module initialization:

Import machinery:

Leaked Objects
  • Type objects (1016 bytes × 2): via type_newPyErr_NewException
  • Dictionary keys (424 bytes × 2): via new_keys_objectPyDict_SetItemString
  • PyCMethod objects (384 bytes × 2 groups): via PyModule_AddFunctions
  • Additional: Unicode strings, tuples, dictionaries
Full Output

See attached .log files for complete LeakSanitizer output for each version.

312.log
313.log
314.log
main.log

CPython versions tested on:

3.12, 3.13, 3.14, 3.15, CPython main branch

Operating systems tested on:

Linux

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduzieren Sie das Leak mit dem dokumentierten ASan-Build und ./python -X dev -X showrefcount -m test test_import -j0. Untersuchen Sie anschließend Modules/_testcapimodule.c (run_in_subinterp), Modules/_testsinglephase.c (init__testsinglephase_basic und init_state) sowie Python/importdl.c (_PyImport_RunModInitFunc). Die Aufgabe ist erledigt, wenn der Test abgeschlossen wird, ohne dass LeakSanitizer die aufgeführten Leaks meldet.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, python
Bereich
performance, testing
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.