什么是静态代码分析?

静态分析有很多选项,这是一个热门话题,所以:

什么是静态分析?

什么时候应该使用它,什么时候不应该使用它?

什么是静态分析正确和不适当的使用/应用的潜在问题?

任何语言都没有一个好的静态分析工具,当你没有自动分析的选项时,你会做什么?

-亚当

什么是静态分析?

分析代码而不执行它。 通常用于查找错误或确保符合编码准则。 经典的例子是一个编译器,它可以find词法,句法甚至语义错误。

什么时候应该使用它,什么时候不应该使用它?

应该使用静态分析工具来帮助维护代码质量。 如果他们被使用,他们应该被整合到构build过程中,否则他们将被忽略。

什么是静态分析正确和不适当的使用/应用的潜在问题?

使用静态分析工具时会出现两种常见的病症:

  1. 这些工具会产生虚假的警告/错误,开发人员无法保持沉默。 最终,大多数警告是虚假的,开发人员不再关注输出。 这就是为什么许多团队要求代码干净地编译。 如果开发人员忽略编译器警告而感到放心,那么编译阶段最终会充满警告,即使它们可能是错误的,也不会引起人们的注意。

  2. 这些工具需要很长时间才能运行,开发人员也懒得去运行它们。

任何语言都没有一个好的静态分析工具,当你没有自动分析的选项时,你会做什么?

由于许多原因,许多dynamic语言(ruby,python,perl)没有静态分析工具,这些静态分析工具和静态语言一样强大。 寻找错误并确保代码在dynamic语言中工作的标准方法是unit testing,这有助于build立代码实际工作的信心(帽子提示:Chris Conway)。

什么是静态分析?

静态分析使我们能够推断程序的所有可能的执行。 它在部署之前给出了任何执行的保证,但商业工具花费了大量精力处理开发人员的混淆,误报等

什么是静态分析正确和不适当的使用/应用的潜在问题?

主要问题是抽象。 抽象让我们扩展和build模所有可能的运行,但必须保守,试图平衡精度和可扩展性。 静态分析抽象并不完全符合开发者抽象

什么时候应该使用它,什么时候不应该使用它?

主要目的是代码testing和维护,因为它符合开发人员的直觉。 在实践中,它是最常见的缺陷检测forms,但是每个testing只探索一个可能的系统执行。 安全行业的开发人员将其用作探索代码错误,漏洞利用等的主要工具。

这里是一个使用符号执行的静态分析的例子,其中关键的想法是通过在评估跟踪符号状态的评估中使用未知的符号variables来概括testing。 如果执行path依赖于未知的,我们叉符号执行器。在符号执行中,我们试图确定某些公式是否可满足(例如是一个特定的程序点可达,是arrays访问A [i]越界?等)。

int a = α, b = β, c = γ; // symbolic int x = 0, y = 0, z = 0; if (a) { x = -2; } if (b < 5) { if (!a && c) { y = 1; } z = 2; } assert(x+y+z!=3) 

和这个简单的代码示例的分析: 静态代码分析

以下是用于静态代码分析的SMT / SAT解算器的一些有用链接:

SAT解决scheme,SMT解决scheme和程序validation

静态代码分析工具列表

符号执行,SAT解决,SMT解决scheme和程序validation

符号执行哈佛CS252r

关于静态分析的其他问题(每个都有工具build议):

  • 分析multithreading程序
  • select一个静态代码分析工具
  • 你使用什么工具进行静态代码分析?

静态分析正在考虑潜在问题的源代码。 它被称为静态的,因为代码没有执行find问题,源parsing分析。

目前,静态分析还很不成熟。 大多数工具只能find最愚蠢的错误。 例如,没有我知道的工具可以find所有的空指针解引用,但这是一个明显的错误,你想用静态分析来定位。 至less目前来说,你可以忘记试图通过静态分析来发现比较困难的错误,比如竞争状态。

静态分析对于执行编码标准特别有用。 分析.NET代码的FXCop包含各种编码标准缺陷的规则。

正如你所说,有很多工具可以做静态分析。 以下是我亲自使用的免费产品列表:

  • FindBugs(Java)
  • FXCop(.NET)
  • PyLint(Python)

我可以推荐他们所有人。

静态分析(也称为静态代码分析,源代码分析,静态程序分析)是一种软件validation活动,其中分析源代码的质量,安全性和安全性。 这种分析使软件开发人员和testing人员能够识别和诊断各种types的错误/错误,例如溢出,除以零,内存和指针错误,运行时错误以及其他问题。

通过静态代码分析产生的度量提供了一种可以测量和改进软件质量的手段。 与其他validation技术相比,静态分析是自动化的,因此可以在不执行程序或开发testing用例的情况下完成。

复杂的技术将静态代码分析与正式方法结合在一起 forms化方法应用理论计算机科学基础来解决软件中的难题,例如certificate软件不会因运行时错误而失败。 静态代码分析和forms化方法的结合使开发人员能够发现难以发现的错误,并certificate缺less某些types的错误/错误。 例如,这些技术可以certificate下面的代码行将永远不会失败,除以零运行时错误:

 int x, y; ... x = x / (x - y); 

一般来说,静态分析应该在开发过程的早期使用,最好是在unit testing之前。 这使得可靠的代码的开发。 静态分析也可以与构build系统相结合,以产生质量指标,并提供关于软件安全性和可靠性的指导。 然而,一般来说,迟滞使用静态分析可能需要更多的时间和资源来解决已确定的问题。

各种开源,学术和商业静态分析工具都可用。 大多数语言都受支持。 在以下链接中了解有关此主题的更多信息

除了在你的代码中发现错误(比如保证空指针解引用,无限循环等等)之外,静态分析还可以用于代码的安全分析。 我强烈推荐观看Fortify软件的Brian Chess的“Secure Programming with Static Analysis”演示文稿。

如果您正在查找企业级工具,请查看http://www.ouncelabs.com