代码之家  ›  专栏  ›  技术社区  ›  C.J.

静态分析API?

  •  4
  • C.J.  · 技术社区  · 14 年前

    我对现有的静态分析工具很感兴趣。或者更确切地说,支持的API允许我使用这些API编写自己的工具。 在我现在的工作中,我已经写了几十篇文章来仔细检查我们的源代码(C++)。但我想知道的一件事是,是否还有其他静态分析API可用。所以

    我的问题是

    1. 您使用什么静态分析API?
    2. 你为什么要用它?
    3. 说出你用它写的一件事?

    至于我,我的答案是:

    什么: 我用API来理解4 C++。

    为什么: 我使用它是因为:

    1. 它的C API是一个头文件(非常小)
    2. C API几乎不需要内存管理
    3. 我在它周围写了一个托管包装,这样我就可以用C来处理它了!
    4. API很小,但在查找各种各样的东西方面很强大。

    一个工具: 上周,我编写了一个工具来获取一个基类上的虚函数,然后更改它的可访问性以及派生类上的所有虚重写。 这要花我一个星期的时间手工完成。使用这个工具,我花了很短的时间来写,只需按一下按钮,我就可以修改几乎一千个文件。酷

    注: 我还参与了VisualStudio中的C++代码模型,并成功地编写了宏来实现这一目标。

    谢谢,我期待你的回答。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Ira Baxter    14 年前

    我们的 DMS Software Reengineering Toolkit 是商用的,用于解析/分析/转换多种语言的源代码的通用机器,包括C、C++、C语言、Java、COBOL、…

    它使用显式的语言定义(例如,bnf)来驱动解析机制来直接构建AST;DMS支持某些语言的多种方言。内置分析仪支持符号表的构建、控制和数据流分析、点分析、符号范围分析…

    对于C、Java和COBOL,内置的分析机器与语言定义绑定在一起,这样您就可以使用这些分析器作为您希望构建的自定义分析的基础。C++确实有符号表,但还没有与其他内部分析器联系在一起,但是机器在那里。

    DMS还提供了程序化和源到源的转换,这些转换受分析结果的制约;修改后的AST可以预先打印,以重新生成可编译源,并完成原始注释。

    你的三个问题:

    1.您使用什么静态分析API?

    • DMS+我上面描述的API。
    • 您可以使用转换方面获得动态分析。

    2.你为什么要用它?

    • 主要用于支持自定义工具构造。 令人惊讶的是人们对代码有多少不同的问题, 以及他们想以多少方式重塑一个大型应用程序。

    3.说出你用它写的一件事?

    • B-2隐形轰炸机Jovial-to-C翻译(认真地说,见网站)。
    • IBM大型机应用程序体系结构提取。
    • 自动化C++组件重构。
    • 克隆检测。
    • 测试覆盖率和轮廓仪
    • 智能差分器
    • (更多详细列表请参见网站)
        2
  •  6
  •   Joseph Garvin    13 年前

    clang 试图为它所支持的语言的静态分析提供一组有用的库。 不幸的是,虽然它的C支持非常好,但是它的C++支持目前还不完善。 (Clang C++支持现在已经成熟,甚至有许多C++ 11功能正在运行)

    为什么要用它呢?它是一个完整的编译器,所以你可以 满的 对您正在使用的代码的可见性。API(至少大部分)是很好的C++设计。

    我还没有写过什么特别严肃的东西。我目前正在开发一个使用 Index library 查找包含但从未引用过的头,但尚未完成(可能永远不会完成——我只是想把它作为进行一些探索的借口,而不是真正有用的工具)。

        3
  •  4
  •   Paul Anderson    14 年前

    我们的工具,命名 CodeSonar 是一个商用先进的C/C++程序静态分析工具。它提供了几个可用于扩展其功能的API。请注意,它是为进行分析而设计的,而不是为进行程序转换而设计的。

    有一些API(在C和Scheme中)允许访问程序的ASTS(包括符号表)、每个子程序的CFG、整个程序调用图、编译单元、包含文件等。所有这些表示都与位置信息交叉关联,因此可以返回到负责的代码行。

    分析引擎访问所有这些数据结构,用户可以通过指定访问期间要调用的回调来编写检查器。

    编码声纳是一种路径敏感的分析工具。由于某些路径是不可行的,因此很难进行路径探索,因此将这些路径排除在考虑范围之外需要付出一定的努力。重要的是要排除不可行的路径,以保持低误报。编码声纳允许用户使用它的路径探索,再次使用访问者模式,这允许他们编写路径敏感的检查程序,而不必自己实现可行的路径探索。

    此机制已用于实现一个检查程序,该检查程序查找与相当复杂的错误报告习惯用法的偏差。

    编写检查的另一种方法是使用另一种特殊用途的API,该API的目的不是执行,而是向分析引擎介绍程序的属性。大致来说,您可以使用此API来编写类似于为动态检查属性而编写的代码,但符号执行引擎会“解释”这些代码。您可以用对这个API的调用来修饰自己的代码,或者将其放在一边。

    许多编码声纳内置的API使用检查程序就是这样指定的。

    写支票只是战斗的一半。一旦在生产中有了一个检查器,您就需要一种方法来管理它所发现的内容。上面描述的所有机制都会生成填充数据库的报告,并且有一个基于Web客户机的UI,用于查看结果、附加注释、与其他工具集成等。

    希望这有帮助!

        4
  •  2
  •   Patrick from NDepend team    12 年前

    ndepend是一个.NET静态分析器,附带完整的ndepend.api来编写自己的静态分析器。

    免责声明:我是该工具的开发人员之一

    ndepend.api是linq友好的。超过 200个代码规则 是建议的。它们基于对ndepend.api的linq查询,我们称之为 cqlinq 。这些代码规则涵盖了广泛的需求(API、Evolution/Diff、命名、体系结构/设计、代码度量/质量、死代码、代码覆盖率、OOP…)您可以使它们适应您自己的需求并创建自己的需求。

    14 power tools open source base on ndepend.api are proposed. 电动工具实际上是定制静态分析仪。在这里,你也可以调整它们或者创建你自己的。如果下载ndepend位,则这些 power tools的代码源位于VisualStudio解决方案中: >$ndependInstallPath$\ndepend.power tools.sourceCode\ndepend.power tools.sln

    编写自己的静态分析器。

    免责声明:我是该工具的开发人员之一

    ndepend.api是linq友好的。不止 200 code rules 提出。它们基于对ndepend.api的linq查询,我们称之为 CQLinq . 这些代码规则涵盖了广泛的需求(API、演进/差异、命名、体系结构/设计、代码度量/质量、死代码、代码覆盖率、OOP…),您可以根据自己的需求进行调整并创建自己的需求。

    十四 电动工具 提出了基于ndepend.api的开放源码技术。 电动工具 实际上是 自定义静态分析器 . 在这里,你也可以调整它们或者创建你自己的。如果您下载ndepend位,这些位的代码源 电动工具 在VisualStudio解决方案中: $ndependInstallPath$\ndepend.powertools.sourceCode\ndepend.powertools.sln

    NDepend Power Tools List