代码之家  ›  专栏  ›  技术社区  ›  peoro

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

  •  6
  • peoro  · 技术社区  · 14 年前

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

    我突然想到的是:

    1. 寻找魔法数字(即:不同于0的硬编码常量数字)。

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


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

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

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

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


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

    否则,您建议使用哪些库来实现这些任务(clang libs、gccxml,…),您认为需要多少工作?

    4 回复  |  直到 11 年前
        1
  •  4
  •   Johan Kotlinski    14 年前

    cppcheck 太棒了。

        2
  •  1
  •   Natansh    14 年前

    谷歌有一个有趣的工具和它的风格指南。。。叫cpplint。这可能有助于生成更干净的代码。看一看。

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

        3
  •  1
  •   dan_waterworth    14 年前

    clang 可以做静态分析。

        4
  •  0
  •   Ira Baxter    14 年前

    关于寻找常数,我们 SD Source Code Search Engine (SCSE) 可以直接做。SCSE提供了GUI接口,用于跨大型混合编程语言文件的搜索,使用查询语言准确地理解每种语言的词汇句法。

    一个典型的问题:

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

    会发现 对于 近旁关键字 其名称必须以序列开头的标识符 指数 紧接着是 = 运算符后跟 N个 数值小于10的数字。因为SCSE理解语言结构,所以它不受空白或格式限制的影响。它还将匹配N的十六进制值;它理解文本的不同格式,并根据数字的实际值(而不是字符串)提供查询。

    给定这样一个查询,GUI将在所有文件中找到所有匹配项,并显示一组点击;点击点击一个点击,就会得到高亮显示点击行的源代码。

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

    N>0
    

    你真正想要的是所有的常量,而不是在某种常量定义中定义的。所以您想从命中列表中删除任何常量定义 通过使用“query subtract”运算符完成:

    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++前端,以包括您认为理想的额外结构。然后,您可以编写寻找此类构造的程序转换,并将它们转换为所需的代码。(这个想法被称为 intentional programming 作者查尔斯·西米尼(Charles Simyoni),她是微软的名人,但这只是程序转换的一个特例。)

    DMS已经被用于对真实的C++应用程序进行大规模的自动化转换。从技术角度看,它可以相当容易地完成您的任务。 然而,理解C++的定义以及如何组合在一起,以及DMS如何支持转换,需要相当大的编译器风格复杂度。你建议做的不是一个下午或一周的工作。这将需要在教育和努力方面进行重大投资。 但比仅仅从YACC开始做要少得多。