什么是动态代码分析?

时间:2008-09-08 15:23:46

标签: code-analysis dynamic-analysis

什么是动态代码分析?

它与Static Code Analysis有什么不同(即,它能捕获哪些不能被静态捕获)?

我听说过检查和记忆分析 - 这些是什么?

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

- 亚当

4 个答案:

答案 0 :(得分:29)

简而言之,静态分析基于源代码收集信息,动态分析基于系统执行,通常使用检测。

动态分析的优点

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

动态分析的缺点

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

资源

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

的年度研讨会

答案 1 :(得分:4)

基本上,您可以使用代码来分析软件在运行时的动态(动态),而不仅仅是在不运行(静态)的情况下分析软件。另请参阅此JavaOne presentation comparing the twoValgrind是C的一个示例动态分析工具。您还可以使用CoberturaEMMA等代码覆盖率工具进行Java分析。

来自维基百科的definition of dynamic program analysis

  

动态程序分析就是这样   计算机软件的分析   执行程序执行   从该软件构建的真实或   虚拟处理器(执行分析   没有执行程序被称为   静态代码分析)。动态程序   分析工具可能需要加载   特殊的图书馆甚至   重新编译程序代码。

答案 2 :(得分:2)

您要求对“边界检查和内存分析”问题进行详细解释。

我们的Memory Safety Check工具会检测您的应用程序在运行时监视内存访问错误(缓冲区溢出,数组下标错误,错误指针,alloc / free错误)。该链接包含 详细解释完整的例子。这个SO answer显示了两个指向死堆栈帧的程序,以及CheckPointer如何检测并报告源代码中的错误点

一个更简单的例子:C(和C ++)臭名昭着不检查对数组的访问,以查看访问是否在数组的边界内。好处:精心设计的程序不支付生产模式中的这种检查的成本。缺点:错误的程序可以触及数组之外的东西,这可能导致很难理解的行为;因此有缺陷的程序很难调试。

像Memory Safety Checker这样的动态检测工具是什么,将一些元数据与每个指针相关联(例如,指针“指向”的东西的类型,如果它是一个数组,则数组绑定),然后在运行时检查通过指向数组的指针的任何访问,是否违反了数组绑定。该工具修改原始程序以收集生成它的元数据(例如,在进入声明数组的作用域时,或作为malloc操作的结果等)并在每个数组引用处修改程序(同时写入作为x [y],其中x或y是数组指针,值是某种类型的整数类型,类似于*(x + y)!)来检查访问。现在,如果程序运行并执行越界访问,则检查会捕获错误并在可以检测到它的第一个位置报告。 [如果你考虑一下,你会发现元数据收集和检查的工具必须非常聪明,以处理像C这样的语言可能具有的所有变体情况。它实际上很难完成这项工作)。

好消息是,现在可以更早地报告此类访问,从而更容易发现问题并修复程序。这种工具不是生产用途;一个在开发和测试期间使用,以帮助验证没有错误。如果没有发现错误,则进行正常编译并运行程序而不进行检查。

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

答案 3 :(得分:1)

  

检查边界

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