C ++:静态分析代码(和/或预处理代码)的工具

时间:2010-11-13 17:05:59

标签: c++ parsing preprocessor

通常我可以使用一些工具来静态分析我的代码,以帮助我使其更清洁。像编译器警告的东西,但这些还不够。我不时地想写一个(使用clang库或gccxml),但我想这需要太多的工作。

我想到的一些事情是:

  1. 寻找幻数(即:与0不同的硬编码常数)。

  2. 检查三个规则始终尊重(每个类必须已定义要么所有的析构函数,复制构造和赋值操作符,或者其中没有)。


  3. 我也梦想(但这些东西都是纯粹的乌托邦)关于预处理器,它解析一些非标准代码并将其转换为有效的C ++代码,这个工具能够:

    1. 扩展模板别名,以便我可以在C ++中使用它们(好吧,不再需要C ++ 0x)

    2. 在文件的结尾移动在线功能,让我没有尊重声明,之前使用的规则,我能够在线写类作为Java编写的。

    3. 提供扩展语法,例如支持自定义运算符(将在函数调用中扩展),或者某些特殊语法/关键字,以便轻松实现某些模式。


    4. 那里有没有工具可以做这些事情的一部分?

      否则你会建议哪些库来实现这些任务(clang libs,gccxml,...),你认为需要做多少工作?

4 个答案:

答案 0 :(得分:4)

cppcheck真是太棒了。

答案 1 :(得分:1)

Google有一个有趣的工具及其样式指南......称为cpplint。生成更干净的代码可能会有所帮助。看看。

http://code.google.com/p/google-styleguide/source/browse/trunk/cpplint/cpplint.py?r=15

答案 2 :(得分:1)

clang可以进行静态分析。

答案 3 :(得分:0)

关于寻找常数,我们的SD Source Code Search Engine (SCSE)可以现成。 SCSE提供GUI界面,用于跨大量混合编程语言文件的搜索,使用一种能够准确理解每种语言的词法语法的查询语言。

典型的查询:

'for' ... I=index* '=' N<10

会在 I 标识符附近找到 关键字,其名称必须以序列 index 开头,后面紧跟 = 运算符后跟一个 N 的值,其值小于10.因为SCSE理解语言结构,所以它不受空格或格式约束的困扰。它还将匹配N的十六进制值;它理解文字的不同格式,并根据数字的实际值提供查询,而不是字符串。

鉴于此类查询,GUI将查找所有文件中的所有匹配项,并显示一组匹配项;点击点击会突出显示命中行的源代码。

要查找非零的所有常量,请编写以下非常简单的查询:

N>0

你真正想要的是所有未在某种常量定义中定义的常量。因此,您希望从命中列表中删除任何常量定义 通过使用“查询减法”运算符完成:

N>0 -  'const' 'int' I '=' N

这会找到非零常量,并删除任何与const声明匹配的常量。


你的其他梦想需要更复杂的引擎。实质上,您希望分析C ++代码(您的三个规则)或使用一些新功能扩展C ++语言,然后使用标准C ++功能实现这些功能。您可以使用program transformation system完成此操作 可以操纵C ++。

我们的DMS Software Reengineering Tookit可以做到这一点。它有一个完整的C++ front end,可以将C ++解析为内部编译器数据结构,并构建完整的符号表(并且可以使用其内部结构中的所有详细信息重新生成C ++源代码)。使用该前端和DMS的内置模式匹配功能,您可以实施三阶检查。

对于语言扩展,您可以通过修改其语法来修改DMS C ++前端,以包含您认为理想的额外构造。然后,您可以编写寻找此类构造的程序转换,并将它们转换为所需的代码。 (这个想法被MS名望的Charles Simyoni称为intentional programming,但这只是程序转换的一个特例。)

DMS已被用于在真实C ++应用程序上执行大规模自动转换。从技术角度来看,它可以相当容易地完成您的任务。 但是,了解C ++的定义以及所有内容如何组合在一起,以及DMS如何支持转换,需要相当大的编译器式复杂性。你建议做的不是下午或一周的工作。这需要对教育和努力进行大量投资。 但是,与仅仅从YACC开始尝试相比要少得多。