部分C ++程序的静态分析

时间:2011-07-11 12:24:27

标签: c++ compilation static-analysis intermediate-language

我正在考虑对C ++代码 samples 进行一些静态分析项目,而不是整个程序。通常,静态分析需要一些更简单的中间表示,但如果没有整个程序代码,就无法准确地创建这种表示。

尽管如此,我知道there is such a tool for Java - 它基本上“猜测”了缺失的信息,因此即使它不再合理或完整,也可以进行静态分析。

是否有类似的东西可用于将部分C ++代码转换为某种中间形式(例如LLVM字节码)?

4 个答案:

答案 0 :(得分:6)

作为一般规则,如果你猜,你猜错了;基于此类猜测的静态分析仪的任何投诉都是误报,并且会导致很高的拒绝率。

如果你坚持猜测,你需要一个可以解析任意C ++片段的工具。 (“猜测这种方法的静态分析......”)。大多数C ++解析器只会解析完整的源文件,而不是片段。

您还需要一种方法来构建部分符号表。 (“我被列为FOO的一个参数,但是没有类型信息,并且它与我在调用FOO之后的声明中声明的不一样”。

我们的DMS Software Reengineering Toolkit及其C++ Front End可以提供片段解析,并可以用作部分符号表的跳板。

DMS提供对代码的一般解析/分析/转换,由提供给DMS的显式语言定义确定。 C ++前端提供了一个完整,强大的C ++前端,使DMS能够使用在其中编码C ++查找规则的属性语法(AG)来解析C ++,构建AST并为这些AST构建符号表。 AG是在AST节点上编码的功能型计算; C ++符号表构建器是本质上的大功能程序,其部分附加到C ++的BNF语法规则。

作为通用解析机制的一部分,给定语言定义(例如C ++前端),DMS可以使用其内置模式语言解析该语言的任意(非)终端。因此,DMS可以解析表达式,方法,声明等或任何其他格式良好的代码片段并构建AST。在提供非格式化片段的情况下,当前在片段解析中获得语法错误;可以扩展DMS的错误恢复,以生成可安全的AST修复,从而解析任意元素。

部分符号表更难,因为许多符号表构建机器依赖于正在构建的符号表的其他部分。然而,由于这全部被编码为AG,因此可以运行与解析的片段相关的AG部分,例如,用于方法的symobl表构建逻辑。 AG可能需要进行广泛的修改,以使其能够以关于缺失符号定义的“假设”进行操作;这些实际上会成为制约因素。当然,缺少的符号可能是几个中的任何一个,您可能最终会得到可能的符号表的配置。考虑:

{ int X;
  T*X;
}

不知道T是什么,短语的类型(甚至它的句法范畴)不能唯一确定。 (DMS将解析T * X;并报告模糊解析,因为有多种可能的匹配解释,请参阅Why can't C++ be parsed with a LR(1) parser?

我们已经完成了一些部分解析和部分符号表的工作,我们在实验中使用DMS捕获包含预处理器条件的代码,其中一些条件状态未定义。这使我们构建条件符号表条目。考虑:

#if  foo
   int X;
#else
   void X(int a) {...}
#endif
...
#if foo
  X++;
#else
   X(7);
#endif

使用条件符号,此代码可以键入check。 X的符号表条目表示类似“X ==> int if if foo else ==> void(int)”。

我认为对带有约束的大型程序片段进行推理的想法很好,但我怀疑它真的很难,而且你将永远尝试解决有关约束的足够信息,以便进行静态分析。

答案 1 :(得分:1)

Understand 4 C++ by SciTools是一种解析源代码的产品,并提供各种指标。作为一种工具,该产品有点像源代码浏览器,但我个人并没有使用它,因为visual studio的Intellisense一样好。

它的真正力量在于它带有C and Perl API。因此,使用它可以编写自己的静态分析工具。是的,它将很好地处理丢失的代码文件。另外,了解4 C ++适用于Windows和许多其他操作系统。

关于你关于中间代码的最后一个问题,理解4 C ++没有为你提供“中间”形式,但是通过它的API,它确实为你提供了抽象语法树上的抽象层,它给了你很多分析源代码的能力。我在工作中使用此API编写了许多工具,并使用托管的C ++ API(which I wrote and shared publicly on codeplex)来包装其原生C API。

答案 2 :(得分:0)

不了解LLVM字节码,但有一句名为PcLint

的古老格言

http://www.gimpel.com/html/index.htm

他们甚至有一个在线测试模块,您可以在其中发布部分代码

答案 3 :(得分:0)

您可以查看:

What open source C++ static analysis tools are available?

这也引用了同样的问题,并在那里提供了一些解决方案。这些可能会有所帮助!