Debug 日志:CPython GH-121528

Debug 日志:CPython GH-121528

💡 原文中文,约9200字,阅读约需22分钟。
📝

内容提要

这篇文章讨论了Python 3.13 Beta版本中的一个Bug,导致低版本编译的扩展无法在Python 3.13中运行。问题出在处理PyExc_TypeError对象时,引用计数发生了变化,导致断言失败。文章提到了两种修复方式,但问题的根源是在PEP 683实现时状态混淆。

🎯

关键要点

  • Python 3.13 Beta版本中存在一个Bug,导致低版本编译的扩展无法运行。

  • Bug编号为GH-121528,源于PEP 683的实现及相关改动。

  • 问题出现在处理PyExc_TypeError对象时,引用计数发生变化,导致断言失败。

  • 社区发现,基于Limited API编译的扩展在Python 3.13中加载时出现问题。

  • 在处理PyExc_TypeError时,_PyObject_Init函数中的逻辑判断导致了assert失败。

  • GH-1161152引入的变更导致了对象的引用计数逻辑发生变化。

  • Py_INCREF宏在3.13和3.11中的实现不同,影响了immortal对象的引用计数。

  • 修复方案包括将assert部分恢复到之前的if条件检查,或扩大immortal对象的检查范围。

  • 根本问题在于PEP 683实现时状态混淆,可能导致后续出现更多问题。

延伸问答

Python 3.13 Beta版本中的Bug是什么?

Python 3.13 Beta版本中的Bug导致低版本编译的扩展无法运行,主要是由于PEP 683的实现及相关改动引起的。

导致Bug的根本原因是什么?

根本原因在于PEP 683实现时状态混淆,影响了对象的引用计数逻辑。

如何修复这个Bug?

修复方案包括将assert部分恢复到之前的if条件检查,或扩大immortal对象的检查范围。

Bug GH-121528的具体表现是什么?

Bug GH-121528表现为在Python 3.13中加载低版本编译的扩展时出现断言失败。

引用计数的变化是如何导致Bug的?

引用计数的变化导致了对PyExc_TypeError对象的判断失败,从而触发了assert失败。

PEP 683对Python对象的影响是什么?

PEP 683的实现导致了immortal对象的状态和引用计数混淆,影响了ABI的兼容性。

🏷️

标签

➡️

继续阅读