Cross-interpreter memory leak in _xidata_release when originating interpreter is destroyed
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 35.9k
- PR マージ指標
- PR 指標を取得中
説明
Bug report
Bug description:
Bug report
Bug summary
There is a known memory leak in Python/crossinterp.c related to the teardown of sub-interpreters when they share data.
When a sub-interpreter packages data into _PyXIData_t and passes it to a receiving interpreter, the receiver is expected to call _PyXIData_Release to free it. However, if the originating interpreter is destroyed before the receiver calls release, the original interpreter's memory context is lost.
In _xidata_release (Python/crossinterp.c around line 1049), the code correctly identifies this state:
PyInterpreterState *interp = _PyInterpreterState_LookUpID(
_PyXIData_INTERPID(xidata));
if (interp == NULL) {
// The interpreter was already destroyed.
// This function shouldn't have been called.
// XXX Someone leaked some memory...
Because the originating interpreter is gone, Python intentionally leaks xidata->obj to avoid a use-after-free segfault.
Proposed Solution Architecture
To resolve this without crashing, we would need to track cross-interpreter data at the interpreter level:
- Modify
PyInterpreterStateto include a thread-safe registry tracking all active_PyXIData_tinstances created by that interpreter. - Register instances during
_PyCode_GetXIDataand deregister them during_xidata_release. - Modify
Py_EndInterpreterteardown to check this registry. If outstanding shared data exists, the shutting-down interpreter must either block until it is released, or forcefully invalidate/free the shared data (using anis_invalidatedflag) before tearing down its ownobmallocstate.
I'm opening this issue to get feedback on the proposed architecture before starting a Pull Request.
CPython versions tested on:
main branch
CPython versions tested on:
CPython main branch
Operating systems tested on:
Windows
Linked PRs
- gh-153745
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Python/crossinterp.c の _xidata_release 周辺から始め、続いて _PyCode_GetXIData と Py_EndInterpreter の teardown パスを追跡してください。先に進む前にリンク先の gh-153745 の作業を確認してください。この issue はアーキテクチャに関するフィードバックを求めており、確定した実装や完了テストを定義していないためです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- c, python
- 領域
- backend
- issue の種類
- バグ
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100