☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免资源泄露

2.1 ID_resourceLeak
目录 › next › previous

对于动态分配的资源,其地址、句柄或描述符等标志性信息不可被遗失,否则资源无法被访问也无法被回收,这种问题称为“资源泄漏”,会导致资源耗尽或死锁等问题,使程序无法正常运行。

在资源被回收之前,记录其标志性信息的变量如果:

  • 均被重新赋值
  • 生命周期均已结束
  • 所在线程均被终止

相关资源便失去了控制,无法再通过正常手段访问。

示例:

int fd;
fd = open("a", O_RDONLY);   // Open a file descriptor
read(fd, buf1, 100);
fd = open("b", O_RDONLY);   // Non-compliant, the previous descriptor is lost
read(fd, buf2, 100);

例中变量 fd 记录文件资源描述符,在回收资源之前对其重新赋值会导致资源泄漏。

另外,动态分配的资源均应在合理的时机回收,避免占用的资源只增不减,最终导致资源耗尽。对于长期运行的服务类程序,如果攻击者能够掌握导致资源分配而又不会释放的外部操作,便形成了可被利用的安全漏洞,攻击者可以耗尽资源使系统瘫痪,这也是“拒绝服务攻击”的一种形式。

任何动态分配的资源均应有回收过程与之对应,不应依赖进程退出时的自动回收,这一点对于可以多次动态加载的库而言犹为重要。

关于避免资源泄露的方法和措施,可参见本规则相关规则的进一步介绍。

相关

ID_memoryLeak ID_memberDeallocation ID_ownerlessResource ID_throwInConstructor ID_multiAllocation ID_unnecessaryAllocation ID_asynchronousTermination ID_exceptionUnsafe

参考

CWE-772 C++ Core Guidelines P.8
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.