본문으로 건너뛰기

[CPython 3.13] SyntaxError 재초기화 시 메모리 누수 수정 (backport)

PR 링크: python/cpython#146519 (3.13 backport) 원본 PR: python/cpython#146251 상태: Merged | 변경: +37 / -11

들어가며

이 PR은 SyntaxError 재초기화 메모리 누수 수정의 3.13 브랜치 backport입니다. 3.14 버전(#146517)과 동일한 수정이지만, 3.14에는 metadata 필드가 추가되어 약간의 차이가 있습니다.

핵심 코드 분석

Before (3.13):

self->end_lineno = NULL;
self->end_offset = NULL;
if (!PyArg_ParseTuple(info, "OOOO|OO",
                      &self->filename, &self->lineno,
                      &self->offset, &self->text,
                      &self->end_lineno, &self->end_offset)) {
    return -1;
}
Py_INCREF(self->filename);
Py_INCREF(self->lineno);

After (3.13):

PyObject *filename, *lineno, *offset, *text;
PyObject *end_lineno = NULL;
PyObject *end_offset = NULL;
if (!PyArg_ParseTuple(info, "OOOO|OO",
                      &filename, &lineno,
                      &offset, &text,
                      &end_lineno, &end_offset)) {
    return -1;
}
Py_XSETREF(self->filename, Py_NewRef(filename));
Py_XSETREF(self->lineno, Py_NewRef(lineno));

3.14와의 차이점은 metadata 필드가 없다는 것뿐입니다. 3.14에서는 PyArg_ParseTuple"OOOO|OOO" 포맷을 사용하지만, 3.13에서는 "OOOO|OO"입니다.

핵심 수정은 동일합니다:

  1. 로컬 변수로 먼저 파싱하여 파싱 실패 시 self-> 멤버 오염 방지
  2. Py_XSETREF로 이전 값의 참조를 안전하게 감소시킨 후 새 값 설정

왜 이게 좋은가

  • 현재 안정 릴리스 수정: 3.13은 현재 가장 많이 사용되는 Python 버전이므로, 이 수정이 가장 큰 영향을 미칩니다.
  • 동일한 테스트: test_syntax_error_memory_leak 테스트가 3.13에도 포함되어 regression을 방지합니다.
  • Py_XSETREF 패턴 적용: 재초기화 경로에서 참조 교체의 표준 패턴을 적용합니다.

정리

3.13 사용자를 위한 SyntaxError 메모리 누수 수정 backport입니다. Py_XSETREF를 사용하여 이전 속성 값의 참조를 안전하게 해제하고, 로컬 변수 파싱으로 파싱 실패 시의 안전성도 확보합니다.

참고 자료


이 포스트는 AI가 작성하였으며, 사실과 다를 수 있습니다. 정확한 정보는 원본 PR을 참고해 주세요.

댓글

관련 포스트

PR Analysis 의 다른글