什么是动态代码分析?
它与Static Code Analysis有什么不同(例如,它可以捕获哪些在静态模式下无法捕获的内容)?
我听说过边界检查和内存分析--它们是什么?
使用动态分析还检查了哪些其他内容?
-Adam
发布于 2008-09-08 15:47:06
简单地说,静态分析是基于源代码收集信息,而动态分析是基于系统执行,通常使用插装。
动态分析的优势
动态分析的缺点
资源
市场上有很多动态分析工具,其中最臭名昭著的就是调试器。另一方面,它仍然是一个学术研究领域。有许多研究人员在研究如何使用动态分析来更好地理解软件系统。有一个专门针对dependency analysis.的年度研讨会
发布于 2008-09-08 15:36:03
基本上,您通过检测代码来分析正在运行的软件(动态),而不是在没有运行(静态)的情况下只分析软件。另请参阅此JavaOne presentation comparing the two。Valgrind是一个用于C的示例动态分析工具。您也可以使用Cobertura或EMMA等代码覆盖率工具进行Java分析。
来自维基百科的definition of dynamic program analysis
动态程序分析是对在真实或虚拟处理器上执行由该软件构建的程序而执行的计算机软件的分析(不执行程序而执行的分析称为静态代码分析)。动态程序分析工具可能需要加载特殊库,甚至需要重新编译程序代码。
发布于 2011-03-11 01:40:02
您要求对“边界检查和内存分析”问题进行很好的解释。
我们的Memory Safety Check工具用于在运行时监视应用程序的内存访问错误(缓冲区溢出、数组下标错误、错误指针、分配/释放错误)。该链接包含详细的解释,并附有示例。此SO answer显示了两个具有指向死堆栈帧的指针的程序,以及CheckPointer如何检测和报告源代码中的错误点
一个更简短的例子:C(和C++)臭名昭著地不检查对数组的访问,以查看访问是否在数组的边界内。好处:设计良好的程序在生产模式下不需要支付这样的检查成本。缺点:有buggy的程序可能会接触到数组之外的东西,这会导致很难理解的行为;因此,buggy程序很难调试。
像内存安全检查器这样的动态插装工具所做的是将一些元数据与每个指针(例如,指针“指向”的对象的类型,如果它是数组,则数组界限)相关联,然后在运行时检查任何经由指向数组的指针的访问,是否违反了数组界限。该工具修改原始程序以收集其生成位置的元数据(例如,在进入声明数组的作用域时,或者作为malloc操作的结果,等等)。并在每次数组引用时修改程序(写为xy,其中x或y是数组指针,值是某种整数类型,类似于*(x+y)!)来检查访问权限。现在,如果程序运行并执行越界访问,检查将捕获错误,并在可以检测到错误的第一个位置报告错误。[如果你仔细想想,你会意识到元数据收集和检查的工具必须非常聪明,才能处理像C这样的语言可能具有的所有变体情况。实际上很难完全做到这一点)。
好消息是,现在这样的访问被提前报告,这样更容易发现问题和修复程序。这样的工具不打算用于生产;在开发和测试期间使用,以帮助验证错误的存在。如果没有发现错误,则执行正常编译并运行程序,而不进行检查。
这是一个非常好的动态分析工具的例子:测试发生在运行时。
https://stackoverflow.com/questions/49937
复制相似问题