返回首页

{A}{A2的}
与论坛上的人沟通时,我注意到有一些关于静态分析方法的持久误解。我决定写了一系列简短的文章,我想告诉你事物的真实状态。
第三个神话是:quot; Valgrind的工具,如用于C / C进行动态分析远远超过静态代码analysisquot的;
声明是很奇怪。动态和静态的分析,只是两个不同的方法,相互补充。程序员似乎明白了,但我听到一遍又一遍,动态分析是优于静态分析。
让我列举的静态代码分析的优势。 诊断程序中的所有分支{A3的}
在实践中进行动态分析并不能掩盖一个程序的所有分支。 Valgrind的球迷听到这些话后,告诉我说,应该建立相应的测试。他们在理论上是正确的。但是,任何人试图建立他们明白它是多么复杂和长期的。在实践中,即使是好的测试覆盖不超过80%的程序代码。
这是明显,尤其是在代码处理non​​-standard/emergency情况片段。如果你把一个旧的项目,它与静态分析检查,大部分的错误会被发现在这些非常的地方。究其原因是项目,即使是旧的,这些碎片留几乎未经测试。下面是一个简单的例子,告诉你,我的意思(FCE超项目):

fp = fopen(name,"wb");

int x = 0;

if (!fp)

  int x = 1;

'X'标志将不等于一,如果文件没有被打开。这是因为这样的错误,出现程序错误:他们崩溃或产生无意义的信息,而不是足够的错误消息。可扩展性{A4}
为了能够定期检查大型项目,通过动态的方法,你必须创建一个特殊的基础设施。你需要特殊的测试。您需要启动不同的输入数据并行应用的几个实例。
静态分析缩放几次更容易。通常,你需要仅一个多核心的电脑运行进行静态分析工具。在更高层次上分析,A5的}
动态分析的优势之一是它知道什么函数和被调用的参数。因此,它可以检查,如果调用是正确的。静态分析,无法知道它在大多数情况下不能检查参数的值。这是这种方法的缺点。但在更高的水平比动态分析静态分析执行分析。此功能允许一个静态分析仪检测的问题是从动态分析的观点是正确的。下面是一个简单的例子(ReactOS工程): {C}
一切都是好从动态分析的角度,而静态分析提供了{A6}因为它是非常可疑,被清除数组的字节数的字节数的指针由不谋而合。
在这里,你是从锵项目的另一个例子:
MapTy PerPtrTopDown;

MapTy PerPtrBottomUp;

void clearBottomUpPointers() {

  PerPtrTopDown.clear();

}

void clearTopDownPointers() {

  PerPtrTopDown.clear();

}

是否有东西在这里动态的分析,可以发现可疑的呢?没有。但静态分析可以怀疑有什么不对。错误是:内clearBottomUpPointers(),必须有这样的代码:"PerPtrBottomUp.clear();"。| viva64.com

回答

评论会员: 时间:2