6 bugs in the compiler pipeline:
- codegen.c:716:
PyLong_FromLongresult not NULL-checked, passed toADDOP_LOAD_CONST. Also never DECREF'd. - codegen.c:3280:
RETURN_IF_ERROR(scope)leaksmangledfrom_PyCompile_MaybeMangle. - codegen.c:792-818:
mangledleaked on 7 macro early-return paths. - codegen.c:669: Unchecked
_PyCompile_PushFBlockreturn, error silently lost. - compile.c:1096-1114:
PyDict_GetItemRefnew ref inorignever DECREF'd. Leaks on every inlined comprehension. - assemble.c:420-421:
ERRORwithoutPyErr_NoMemory()on bytecode overflow.
import sys
before = sys.gettotalrefcount()
for i in range(10000):
compile("[x for x in range(10)]", "<test>", "eval")
after = sys.gettotalrefcount()
print(f"Leaked {after - before} refs")