CodeQL 文档

__del__ 被显式调用

ID: py/explicit-call-to-delete
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - reliability
   - correctness
Query suites:
   - python-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

__del__ 特殊方法旨在由 Python 虚拟机在对象不再可达时调用,但在对象被销毁之前调用。显式调用 __del__ 方法可能会导致对象进入不安全状态。

建议

如果需要显式清理对象,则应调用 close() 方法,或者更好地,使用 with 语句包装对象的用法。

示例

在第一个示例中,程序员调用了 __del__,而不是以常规方式关闭 zip 文件。第二个示例展示了更安全的替代方法。



def extract_bad(zippath, dest):
    zipped = ZipFile(zippath)
    try:
        zipped.extractall(dest)
    finally:
        zipped.__del__()

def extract_good(zippath, dest):
    zipped = ZipFile(zippath)
    try:
        zipped.extractall(dest)
    finally:
        zipped.close()

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私