如何构建一个静态代码分析工具?

30

我正在理解并构建一种静态代码分析工具,用于某大公司的一种专有语言。之所以这样做,是因为我必须审核一个相当庞大的代码库,而静态代码分析会对此有很大帮助,而他们目前尚未拥有此类工具。

我想知道如何构建静态代码分析工具,例如C语言的Lint或SpLint。

任何书籍、文章、博客、网站等都会有所帮助。

谢谢。


1
这是一个非常广泛的问题,所以我会给出一个同样宽泛的建议 - 不要忘记由于 Rice 定理而无法执行的分析。 - Robert
你想分析什么? - Noon Silk
@Noon,我想分析错误。 - codeanalyser
4个回答

7

我知道这是一篇旧文章,但是答案似乎并不令人满意。 这篇文章 是静态分析工具背后技术的很好介绍,并提供了几个示例链接。

一本好书是 Brian Chest 和 Jacob West 的《使用静态分析进行安全编程》。


4
你需要良好的基础设施,例如解析器、树构建器、树分析器、符号表构建器、流分析器,然后为了完成特定任务,你需要编写针对特定问题的特定检查,使用所有基础设施机器。
构建所有这些基础设施实际上非常困难,并且它并不能帮助你完成特定任务。人们不会为每个应用程序编写操作系统;为什么你要构建所有基础设施呢?就像操作系统一样,如果你简单地获取良好的基础设施,那就更好了。
人们会告诉你要使用lex和yacc。这有点像建议你使用操作系统的实时内核部分;虽然有用,但远远不是你真正需要的所有基础设施。
我们的DMS软件重构工具包提供了所有必要的基础设施。它已被用来定义许多语言前端以及许多工具,用于这些语言。
这样的基础设施可以让您相对快速地定义您的特定非标准语言,然后继续编写您的特殊检查任务。

DMSToolkit让我想起了另一个语言操作框架,名为Soot(http://sable.github.io/soot/)。像DMSToolkit一样,Soot也公开了调用流图、控制流图等。最有趣的是它公开了中间表示形式。 - sumitb.mdi
1
Soot是专门针对Java的(如果我没记错的话,它更专注于类文件而不是源代码)。因此,可以为该任务定义特定的“中间表示”。DMS则更加通用;它操作源代码(我们的Java领域也读取类文件)。DMS不是一个固定的中间表示,而是定义了AST和数据流模式,这些模式是基于每种语言实例化的。 - Ira Baxter
@Baxter:是的,我同意你的看法,Soot是专门为Java设计的。只是这个工具与DMS非常相似,所以我认为值得一提。 - sumitb.mdi

2

0
  1. 显然,您需要为该语言编写解析器。一个好的高级AST非常有用。
  2. 您需要列举出该语言中的一组“错误”。如果不了解该语言的更多信息,我们无法提供帮助。例如:C语言中未分配的指针等。
  3. 将AST与第2点中的错误结合起来。

如何使用AST查找错误。 - codeanalyser
2
@codeanalyser:基本上你不需要(或者你只追求琐碎的东西)。对于任何有趣的分析,你需要比抽象语法树更多的东西。请参见www.semanticdesigns.com/Products/DMS/LifeAfterParsing.html。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接