避免资源泄露
2.1 ID_resourceLeak
对于动态分配的资源,其地址、句柄或描述符等标志性信息不可被遗失,否则资源无法被访问也无法被回收,这种问题称为“资源泄漏”,会导致资源耗尽或死锁等问题,使程序无法正常运行。
在资源被回收之前,记录其标志性信息的变量如果:
- 均被重新赋值
- 生命周期均已结束
- 所在线程均被终止
相关资源便失去了控制,无法再通过正常手段访问。
示例:
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