我听说过边界检查和内存分析-这些是什么?
使用动态分析检查其他哪些内容?
-亚当简单地说,静态分析基于源代码收集信息,而动态分析则基于系统执行(通常使用检测工具)。
动态分析的优势能够检测在静态分析中无法检测到的"/>

什么是动态代码分析?

什么是动态代码分析?

What is Dynamic Code Analysis?

什么是动态代码分析?

它与"静态代码分析"有什么不同(即,它可以捕获哪些不能在静态中捕获)?

我听说过边界检查和内存分析-这些是什么?

使用动态分析检查其他哪些内容?

-亚当


简单地说,静态分析基于源代码收集信息,而动态分析则基于系统执行(通常使用检测工具)。

动态分析的优势

  • 能够检测在静态分析中无法检测到的依赖项。例如:使用反射,依赖注入,多态性的动态依赖。
  • 可以收集时间信息。
  • 处理实际输入数据。在静态分析期间,很难甚至不可能知道哪些文件将作为输入传递,哪些WEB请求将到达,哪些用户将单击等等。

动态分析的缺点

  • 可能会对应用程序的性能产生负面影响。
  • 无法保证源代码的完整覆盖,因为它的运行是基于用户交互或自动测试的。

资源

市场上有许多动态分析工具,它们是最臭名昭著的调试器。另一方面,它仍然是一个学术研究领域。有许多研究人员正在研究如何使用动态分析来更好地理解软件系统。有一个年度研讨会专门研究依赖性分析。


基本上,您可以检测代码以分析软件的运行状态(动态),而不仅仅是分析软件而不运行(静态)。另请参见此JavaOne演示文稿,将两者进行比较。 Valgrind是用于C的示例动态分析工具。您还可以使用代码覆盖率工具(例如Cobertura或EMMA)进行Java分析。

来自Wikipedia对动态程序分析的定义:

Dynamic program analysis is the
analysis of computer software that is
performed with executing programs
built from that software on a real or
virtual processor (analysis performed
without executing programs is known as
static code analysis). Dynamic program
analysis tools may require loading of
special libraries or even
recompilation of program code.


您要求对"边界检查和内存分析"问题做出很好的解释。

我们的内存安全检查工具会检测您的应用程序,以在运行时监视内存访问错误(缓冲区溢出,数组下标错误,指针错误,分配/空闲错误)。链接包含
详细的解释以及示例。 SO的答案显示了两个指向死堆栈帧的指针的程序,以及CheckPointer如何检测和报告源代码

中的错误点。

一个更简单的示例:臭名昭著的C(和C)不检查对数组的访问,以查看访问是否在数组的边界之内。好处:精心设计的程序无需在生产模式下支付此类检查的费用。缺点:有缺陷的程序可能会触及数组外部的东西,这会导致难以理解的行为;因此,越野车程序很难调试。

诸如内存安全检查器之类的动态检测工具所执行的操作是将一些元数据与每个指针相关联(例如,指针"指向"对象的类型,如果是数组,则数组边界),然后在运行时检查通过数组指针的任何访问,是否违反了数组绑定。该工具修改原始程序以收集生成元数据的位置(例如,在声明数组的作用域时输入,或者作为malloc操作的结果等),并在每个数组引用处修改程序(将两者写入作为x [y],其中x或y是数组指针,并且值是某种整数类型,对于*(xy)!类似)以检查访问。现在,如果程序运行并执行越界访问,检查将捕获该错误,并在可以检测到该错误的第一个位置报告该错误。 [如果考虑一下,您将意识到元数据收集和检查的工具必须非常聪明,以处理C之类的语言可能遇到的所有变体情况。实际上很难使其完全工作)。

好消息是,现在已经报告了这种访问方式,因此更容易检测到问题并修复程序。此类工具并非预期用于生产用途;在开发和测试过程中使用一种方法来帮助验证是否存在错误。如果没有发现错误,则可以正常编译并运行程序而无需检查。

这是动态分析工具的一个非常好的示例:测试在运行时进行。


Bounds checking

这意味着对数组访问进行运行时检查。与C的内存访问和指针算术的自由放任方式相反,其他语言(例如Java或C#)实际上检查给定数组是否具有一个正在尝试访问的元素。


推荐阅读