首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态和动态代码分析

静态和动态代码分析
EN

Stack Overflow用户
提问于 2012-10-15 01:21:03
回答 2查看 7.7K关注 0票数 6

我发现了几个关于这个主题的问题,所有这些问题都有很多参考文献,但我仍然不清楚这一点,因为大多数参考文献都谈到了具体的工具,而不是一般的分析概念。因此,我有几个问题:

关于静态分析: 1.我想有一个参考,或总结哪些技术是成功的,并具有更多的相关性。2.他们到底能做些什么来发现bug,我们能做一个总结吗,还是取决于工具?

关于符号执行: 1.在哪里可以包含符号执行?我想,根据方法的不同,我想知道它们是动态分析,还是静态和动态分析的混合,如果可以确定的话。

我在工具中发现了区分这两种不同技术的问题,甚至我认为我知道理论上的区别。

我实际上是在用C语言工作,谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-10-15 01:42:03

我试着给出一个简短的答案:

静态分析着眼于代码的语法结构,并得出关于程序行为的结论。这些结论不一定总是正确的。

静态分析的一个典型示例是数据流分析,在数据流分析中,您可以为每条语句计算usedreadwrite等集合。这将有助于查找例如未初始化的值。

您还可以分析有关代码模式的代码。这样,这些工具就可以用来检查您是否符合特定的编码标准。一个突出的编码标准示例是MISRA。此编码标准用于安全关键系统,避免了C语言中有问题的构造。通过这种方式,您已经可以说出很多关于应用程序针对内存泄漏、悬空指针等的健壮性的信息。

动态分析不仅关注语法,还考虑状态信息。在符号执行中,您正在向语句中添加有关所有变量的可能值的假设。

最昂贵和最强大的动态分析方法是模型检查,在这种方法中,您可以真正查看系统的所有可能的执行状态。你可以把一个经过模型检查的系统想象成一个100%覆盖率的系统--但是当然有很多实际的问题阻止了真正的系统以这种方式被检查。

这些方法非常强大,您可以从静态代码分析工具中获益良多,特别是在与良好的编码标准相结合时。

我的软件团队发现了一个非常令人印象深刻的特性,例如,当一个带有虚拟方法的类没有虚拟析构函数时,它会在C++中告诉你。实际上很容易检查,但真的很有帮助。

商业工具非常昂贵,但一旦你学会了如何使用它们,它是值得的。一开始的一个典型问题是,你会得到很多错误的警报,而不知道去哪里寻找真正的问题。

请注意,现在g++已经内置了一些这样的东西,并且你可以使用像pclint这样的免费东西。

对不起-这已经变得相当long...hope了,这很有趣。

票数 8
EN

Stack Overflow用户

发布于 2015-03-12 14:09:46

术语“静态分析”意味着分析实际上并不运行代码。另一方面,“动态分析”运行代码,也需要一些真实的测试输入。这就是它的定义。没别的了。

静态分析使用各种形式的方法,如抽象解释、模型检查和符号执行。一般而言,抽象解释或模型检查适用于软件验证。符号执行更适合于查找错误的目的。

符号执行分析( Symbolic )被分为静态分析()。然而,有一种称为concolic execution的混合方法,它同时使用符号执行和动态测试。

为Zane的评论添加:

也许我的解释有点令人困惑。

软件验证和错误发现之间的区别在于分析是否合理。例如,当我们说缓冲区溢出分析器是健全的,这意味着分析器必须报告所有可能的缓冲区溢出。如果分析器没有报告任何内容,则证明目标程序中没有缓冲区溢出。由于模型检测是一种保证可靠性的方法,因此它主要用于软件验证。

另一方面,今天大多数商业静态分析器积极使用的符号执行并不能保证可靠性,因为声音分析本身就会发出大量的误报。为了发现错误,更重要的是减少误报,即使一些真正的阳性也会丢失。

总而言之,

查找结果:没有错误的negatives

  • completeness:没有错误的positives

  • software验证:完整性比completeness

  • bug 更重要:完整性比

更重要

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12884623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档