通常我可以使用一些工具来静态分析我的代码,以帮助我使其更清洁。像编译器警告的东西,但这些还不够。我不时地想写一个(使用clang库或gccxml),但我想这需要太多的工作。
我想到的一些事情是:
寻找幻数(即:与0不同的硬编码常数)。
检查三个规则始终尊重(每个类必须已定义要么所有的析构函数,复制构造和赋值操作符,或者其中没有)。
我也梦想(但这些东西都是纯粹的乌托邦)关于预处理器,它解析一些非标准代码并将其转换为有效的C ++代码,这个工具能够:
扩展模板别名,以便我可以在C ++中使用它们(好吧,不再需要C ++ 0x)
在文件的结尾移动在线功能,让我没有尊重声明,之前使用的规则,我能够在线写类作为Java编写的。
李>提供扩展语法,例如支持自定义运算符(将在函数调用中扩展),或者某些特殊语法/关键字,以便轻松实现某些模式。
那里有没有工具可以做这些事情的一部分?
否则你会建议哪些库来实现这些任务(clang libs,gccxml,...),你认为需要做多少工作?
答案 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开始尝试相比要少得多。