[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"입니다.
핵심 수정은 동일합니다:
- 로컬 변수로 먼저 파싱하여 파싱 실패 시
self->멤버 오염 방지 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 의 다른글
- 이전글 [sglang] CI 테스트 최적화: MXFP8 Gemm에 오프라인 양자화 체크포인트 적용
- 현재글 : [CPython 3.13] SyntaxError 재초기화 시 메모리 누수 수정 (backport)
- 다음글 [CPython] SyntaxError 재초기화 시 메모리 누수 수정
댓글