什么是动态代码分析?
它与静态代码分析有什么不同(即它可以捕捉到什么不能在静态中捕捉到)?
我听说过边界检查和内存分析——这些是什么?
使用动态分析还检查了哪些其他事项?
-亚当
简单来说,静态分析基于源代码收集信息,而动态分析基于系统执行,通常使用插装。
市场上有很多动态分析工具,其中最臭名昭著的是调试器。另一方面,它仍然是一个学术研究领域。有许多研究人员正在研究如何使用动态分析来更好地理解软件系统。有一个专门用于依赖分析的年度研讨会。
基本上,您检测代码以在软件运行时分析软件(动态),而不是仅分析软件而不运行(静态)。另请参阅比较两者的 JavaOne 演示文稿。Valgrind是 C 语言动态分析工具的一个示例。您还可以使用Cobertura或EMMA等代码覆盖工具进行 Java 分析。
来自维基百科对动态程序分析的定义:
动态程序分析是通过在真实或虚拟处理器上执行从该软件构建的程序来执行的计算机软件分析(在不执行程序的情况下执行的分析称为静态代码分析)。动态程序分析工具可能需要加载特殊库甚至重新编译程序代码。
您要求对“边界检查和内存分析”问题进行很好的解释。
我们的内存安全检查工具会检测您的应用程序以在运行时监视内存访问错误(缓冲区溢出、数组下标错误、错误指针、分配/释放错误)。该链接包含带有示例的详细说明。这个SO 答案显示了两个具有指向死堆栈帧的指针的程序,以及 CheckPointer 如何检测并报告源代码中的错误点
一个更简单的例子:臭名昭著的 C(和 C++)不检查对数组的访问,以查看访问是否在数组的范围内。好处:精心设计的程序不会在生产模式下支付这种检查的成本。缺点:有缺陷的程序可能会接触到数组之外的东西,这会导致难以理解的行为;因此,有缺陷的程序很难调试。
像内存安全检查器这样的动态检测工具所做的是将一些元数据与每个指针相关联(例如,指针“指向”的事物的类型,如果它是数组,则数组边界),然后检查在运行时,通过指向数组的指针进行的任何访问,无论是否违反了数组绑定。该工具修改原始程序以收集生成元数据的位置(例如,在进入声明数组的范围时,或作为 malloc 操作的结果等),并在每个数组引用处修改程序(同时编写作为 x[y] ,其中 x 或 y 是数组指针,值是某种类型的整数类型,类似于 *(x+y)!) 来检查访问。现在如果程序运行并执行越界访问,检查捕获错误,并在可以检测到的第一个地方报告。[如果你仔细想想,你会意识到元数据收集和检查的工具必须非常聪明,才能处理像 C 这样的语言可能存在的所有变体情况。实际上很难完全完成这项工作)。
好消息是,现在这种访问被提前报告,这样更容易检测到问题并修复程序。这样的工具不打算用于生产。在开发和测试期间用于帮助验证没有错误。如果没有发现错误,则进行正常编译并运行程序而无需检查。
这是动态分析工具的一个非常好的例子:测试发生在运行时。
边界检查
这意味着对数组访问进行运行时检查。与 C 对内存访问和指针运算的自由放任方法相反,Java 或 C# 等其他语言实际上检查给定数组是否具有试图访问的元素。