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

C++ C++;:静态分析代码(和/或预处理代码)的工具,c++,parsing,preprocessor,C++,Parsing,Preprocessor,通常,我可以使用一些工具静态分析代码,以帮助我使其更干净。类似于编译器警告,但这些还不够。我时不时地梦想着写一个(使用clang库或gccxml),但我想这会花费太多的工作 我想到的一些事情是: 寻找幻数(即:不同于0的硬编码常量) 检查是否始终遵守三个规则(每个类必须定义所有析构函数、复制构造函数和赋值运算符,或者不定义它们) 我也梦想(但这些东西是纯粹的乌托邦),它是一个预处理器,它解析一些非标准代码并将其翻译成有效的C++代码,一个工具可以: < p>展开模板别名,以便我可以在C++中

通常,我可以使用一些工具静态分析代码,以帮助我使其更干净。类似于编译器警告,但这些还不够。我时不时地梦想着写一个(使用clang库或gccxml),但我想这会花费太多的工作

我想到的一些事情是:

  • 寻找幻数(即:不同于0的硬编码常量)

  • 检查是否始终遵守三个规则(每个类必须定义所有析构函数、复制构造函数和赋值运算符,或者不定义它们)


  • 我也梦想(但这些东西是纯粹的乌托邦),它是一个预处理器,它解析一些非标准代码并将其翻译成有效的C++代码,一个工具可以:

    < p>展开模板别名,以便我可以在C++中使用它们(很好,用C++不再需要这个)

  • 在文件末尾移动内联函数,这样我就不必遵守使用前声明规则,并且能够像在Java中那样内联编写类

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


  • 有没有什么工具可以做这些事情的一个子集


    否则,您会建议哪些库来实现这些任务(clanglibs、gccxml等等),以及您认为需要做多少工作?

    谷歌有一个有趣的工具以及它的样式指南。。。叫做cpplint。这可能有助于生成更干净的代码。看一看


    真是太棒了。

    可以做静态分析。

    关于寻找常数,我们可以做现成的。SCSE提供GUI界面,用于跨大型混合编程语言文件集进行搜索,使用能够准确理解每种语言词汇语法的查询语言

    一个典型的查询:

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

    N>0 -  'const' 'int' I '=' N
    
    这将查找非零常量,并删除与const声明匹配的任何常量


    你的其他梦想需要一个更复杂的引擎。本质上,你想分析C++代码(你的三的规则)或者扩展C++语言的一些新特性,然后使用标准C++能力来实现这些特性。您可以使用 可以操纵C++,

    我们可以做到这一点。它有一个完整的语法,它将C++解析为内部编译器数据结构,并构建完整的符号表(并且可以从内部结构中重新生成C++源代码)。使用该前端和DMS内置的模式匹配功能,您可以实现三项检查规则

    <>语言扩展,你可以通过修改语法来修改DMS C++前端,包括你认为理想的额外结构。然后,您可以编写程序转换来查找这些构造,并将它们转换为所需的代码。(这一想法由MS fame的查尔斯·西米奥尼(Charles Simyoni)提出,但只是程序转换的一个特例。)

    已被用于对实际C++应用程序进行大规模的自动转换。从技术角度来看,它可以相当容易地完成您的任务。 然而,理解C++的定义以及如何将所有的事物组合在一起,以及DMS如何支持转换,需要相当大的编译器风格的复杂性。你建议做的不是一个下午或一周的工作。这需要在教育和努力方面进行大量投资。
    但是,比起尝试用YACC来做事情要少很多。根据这个,CLAN只能对C和Objor -C进行静态分析。C,你曾经用过C++吗?我自己还没有用过。我想C++分析是在编写的过程中,编译器支持C++只是一个简单的例子。
    N>0 -  'const' 'int' I '=' N