CodeQL 文档

对象销毁期间缺少对 __del__ 的调用

ID: py/missing-call-to-delete
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - efficiency
   - correctness
Query suites:
   - python-security-and-quality.qls

单击查看 CodeQL 仓库中的查询

与 Java 等静态类型语言不同,Python 允许在对象销毁期间完全自由地调用方法。但是,标准的面向对象原则适用于使用深度继承层次结构的 Python 类。因此,开发人员有责任确保在需要调用多个 __del__ 方法时,对象被正确清理。

如果在对象销毁期间未调用超类的 __del__ 方法,则很可能导致资源泄漏。

在对象销毁期间,可能会省略对超类的 __del__ 方法的调用

  • 当子类调用错误类的 __del__ 方法时。

  • 当省略对一个或多个基类的 __del__ 方法的调用时。

建议

要么注意显式调用正确基类的 __del__,要么在整个继承层次结构中使用 super()

或者重构一个或多个类以使用组合而不是继承。

示例

在此示例中,使用了对 __del__ 的显式调用,但 SportsCar 错误地调用了 Vehicle.__del__。通过在 FixedSportsCar 中调用 Car.__del__,修复了此问题。


class Vehicle(object):
    
    def __del__(self):
        recycle(self.base_parts)
        
class Car(Vehicle):
    
    def __del__(self):
        recycle(self.car_parts)
        Vehicle.__del__(self)
        
#Car.__del__ is missed out.
class SportsCar(Car, Vehicle):
    
    def __del__(self):
        recycle(self.sports_car_parts)
        Vehicle.__del__(self)
        
#Fix SportsCar by calling Car.__del__
class FixedSportsCar(Car, Vehicle):
    
    def __del__(self):
        recycle(self.sports_car_parts)
        Car.__del__(self)
        

参考资料

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