常见的Java审计代码函数关键字_自动代码审计中常见关键缺陷及示例:RESOURCE_LEAK(CWE404,403,775)...

语言:.C、C++、C#、Java、Objective-C、Objective-C++

RESOURCE_LEAK 查找程序没有尽快释放系统资源的情况。没有释放所需资源的应用程序可能面临性能降级、崩溃、拒绝服务或无法成功获取指定资源。

Android(仅限 Java):对于基于 Android 的代码,此检查器 查找与用户活动、屏幕活动、应用程序状态以及其他项目相关的问题。 可

C/C++

对于 C/C++,RESOURCE_LEAK 可从"占有"资源(最常见的是新分配的内存)期间越界的变量中查找许多类型的资源泄漏。

轻微的内存泄漏可能导致长时间运行且未重启的进程发生问题。严重的内存泄漏可能导致进程崩溃。如果来自网络的用户输入内容或数据触发了内存泄漏,则可能发生拒绝服务攻击。

文件描述符或套接字泄漏可能导致崩溃、拒绝服务以及无法打开更多文件或套接字。操作系统可限制一个进程可以拥有多少个文件描述符和套接字。达到限制后,进程必须先关闭一部分资源的打开句柄,然后才能分配更多。如果进程泄漏了这些句柄,则在进程终止之前,无法回收这些资源。

很多内存泄漏都发生在错误路径中,其中会遇到错误条件并且意外泄漏内存。其中一些情况可以通过在函数中使用单独的退出标签(每个错误退出通过 goto 语句转到其中)避免。此退出标签可以根据需要释放资源。

避免内存泄漏的常用技术是使用可记住在 arena 中分配的所有内存的 arena,直到单个释放点将其完全释放。在适当的情况下,arena 分配器拥有显著的速度和正确性优势。

在 C++ 中,资源获取即初始化 (RAII) idiom 可以自动释放资源。idiom 包含一个类,该类包含一个可释放资源的构造函数和一个可释放资源的析构函数。在声明该类类型的本地变量时,它会在越界时自动调用析构函数来释放资源。这还可以防止由抛出的异常导致的泄漏。

默认情况下,检查器会做出以下假设,以减少误报:未实现的函数别名或释放参数。

通过 ...(省略号表示未指定数量的参数)传递的指针被传递给不会导致资源泄漏的函数。

当 main() 返回时,释放内存。

转换为整数的跟踪指针使用别名。

您可以启用各种选项来更改这些假设,并增加报告的缺陷数。

C#

在 C# 中,并不能保证 .NET Garbage Collector 一定会及时或完全关闭系统资源,即使在某些情况下,它会在其他对象无法访问相应资源时关闭此类资源。依靠该垃圾回收器或终结函数来清理这些资源会导致资源的保留时间超过必要的时间。这种浪费可能导致资源耗尽,在这种情况下,在同一系统中运行的您的程序或其他程序会由于无法获取这些资源而无法运行。因此,尽快显式释放这些资源才是好做法。如果可以,Dispose() 和 Close() 方法允许显式释放资源。

如果发现 Dispose() 方法永远无法释放资源,RESOURCE_LEAK 检查器不会报告缺陷。

Java

对于 Java,RESOURCE_LEAK 查找程序没有尽快释放诸如文件句柄、套接字和数据库 Statement 对象等系统资源的情况。虽然在某些情况下,垃圾收集器会在其他对象无法访问相关资源时关闭此类资源,但并不保证它一定会及时或完全关闭这些资源。依靠该垃圾回收器或终结函数来清理这些资源会导致资源的保留时间超过必要的时间。这种浪费可能导致资源耗尽,在这种情况下,在同一系统中运行的您的程序或其他程序会由于无法获取这些资源而无法运行。因此,尽快显式释放这些资源才是好做法。

RESOURCE_LEAK 检查器可查找只通过本地变量引用的资源泄漏。它在程序间执行检查,从而确定返回资源的方法和可节省或关闭传入其中的资源的方法。它不会跟踪存储到对象字段中的资源。您可以使用 Dynamic Analysis RESOURCE_LEAK 检查器查找此类资源的泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值