什么是动态代码分析?

它与什么不同 静态代码分析 (即,它能捕获什么不能在静态中捕获的东西)?

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

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

-亚当

有帮助吗?

解决方案

简单来说,静态分析基于收集信息 源代码 和动态分析是基于 系统执行, ,经常使用仪器。

动态分析的优点

  • 能够检测静态分析中无法检测到的依赖关系。前任。:使用反射、依赖注入、多态性的动态依赖。
  • 可以收集时间信息。
  • 处理真实的输入数据。在静态分析过程中,很难甚至不可能知道哪些文件将作为输入传递、哪些 WEB 请求将到来、用户将点击哪些内容等。

动态分析的缺点

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

资源

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

其他提示

基本上,您可以在软件运行时(动态)检测代码来分析软件,而不是仅在不运行的情况下分析软件(静态)。另请参阅此 JavaOne 演示文稿比较两者. 瓦尔格林德 是 C 动态分析工具的一个示例。您还可以使用代码覆盖率工具,例如 科贝尔图拉 或者 埃玛 用于 Java 分析。

来自维基百科的 动态程序分析的定义:

动态程序分析是对计算机软件的分析,该分析是通过在真实或虚拟处理器上构建的该软件构建的执行程序执行的(无执行程序执行的分析称为静态代码分析)。动态程序分析工具可能需要加载特殊库,甚至需要加载程序代码。

您要求对“边界检查和内存分析”问题有一个很好的解释。

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

一个更简短的例子:C(和 C++)臭名昭著的是不检查对数组的访问,以查看访问是否在数组的范围内。好处:设计良好的程序不需要在生产模式中支付此类检查的成本。不足之处:有缺陷的程序可以接触数组之外的东西,这可能会导致很难理解的行为;因此,有缺陷的程序很难调试。

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

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

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

边界检查

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top