【问题标题】:Static Analysis API's?静态分析 API?
【发布时间】:2012-06-06 00:08:45
【问题描述】:

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

我的问题是

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

至于我,我的答案是:

什么: 我使用 API 来理​​解 4 c++。

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

  1. 它的 C API 是一个头文件(非常小)
  2. C API 几乎不需要内存管理
  3. 我围绕它编写了一个托管包装器,因此我可以将 c# 与它一起使用!
  4. API 非常小,但在查找各种事物方面功能强大。

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

注意: 我还尝试过 Visual Studio 提供的 C++ 代码模型,并且成功地编写了宏来针对它。

谢谢,我期待您的任何答案。

【问题讨论】:

  • @graham:感谢您整理我的清单。

标签: c++ api static-analysis


【解决方案1】:

clang 试图提供一组有用的库,用于对其支持的语言进行静态分析。 不幸的是,虽然它的 C 支持很好,但它的 C++ 支持目前还很不完整。(Clang C++ 支持现在已经成熟,甚至许多 C++11 功能都在工作)

为什么要使用它?它是一个成熟的编译器,因此您可以完全了解您正在使用的代码。 API 是(至少大部分)设计精美的 C++。

我还没有写任何特别严肃的东西。我目前正在开发一种工具,该工具使用Index library 来查找包含但从未被引用的标题,但它还没有完成(可能永远不会——我只是真的打算把它作为做一些探索的借口,而不是真的是一个有用的工具)。

【讨论】:

  • 这看起来很有趣。我将不得不玩它。是否愿意修改您的答案以完成其余问题?
  • 我认为查找包含不必要的标头是一项重要任务。我的工作构建时间现在长达 1 小时 55 分钟。我希望通过这样的工作减少构建时间。
  • 嗯,有消除无用的包含文件,也有无用的包含文件内容。在大型 C 系统(25M 行)上使用 DMS(请参阅其他答案),我们发现在许多编译单元上平均所有包含文件的 90% 以上的内容是编译单元未使用的定义。 (不同的编译单元可能使用不同的 90% 的相同包含文件)。所以真正的问题似乎是将包含文件分成几部分,以便不包含很少使用的东西。我们还没有探索过这个选项。
  • 啊,大量头文件的危险。我们的头文件通常超过 10,000 行。只有白痴才会像这样发送垃圾代码。我编写了一个粉碎机应用程序,将 API 粉碎成尽可能小的单元:每个类一个头文件,每个函数定义一个头文件……等等。它还重新挂钩了包含依赖项,因此“新”API 可以编译。它应该减少不必要的包含不需要的东西。我没有更多地玩它,因为“管理层”认为没有必要发布。
【解决方案2】:

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

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

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

CodeSonar 是一个路径敏感的分析工具。路径探索很困难,因为有些路径是不可行的,并且将这些路径排除在考虑之外需要一些努力。排除不可行的路径以保持低误报非常重要。 CodeSonar 允许用户搭载其路径探索,再次使用访问者模式,这允许他们编写路径敏感检查器,而无需自己实现可行路径探索。

此机制已被用于实现一个检查器,该检查器可以发现与相当复杂的错误报告习语的偏差。

另一种编写检查的方法是使用不同的专用 API,其目的不是执行,而是让分析引擎了解程序的属性。粗略地说,您可以使用此 API 编写类似于为属性动态检查编写的代码,但由符号执行引擎“解释”。您可以通过调用此 API 来装饰自己的代码,或者将其全部放在一边。

许多 CodeSonar 的 API 使用内置检查器都是以这种方式指定的。

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

我希望这会有所帮助!

【讨论】:

  • 听起来像这个应用程序,API用于编写模拟路径覆盖等的静态分析工具?我使用的 API 不执行任何操作,而只是告诉我,谁调用了某个东西,它在哪里被调用,一个类有多少成员,以及它们的类型等...... CodeSonar 会这样做吗? (错误...快点?:))
  • 听起来你的工具做了类似 Coverity 的功能?
  • 是的,CodeSonar 的 API 可以让您访问所有这些信息。唯一需要注意的是,如果您需要考虑间接调用(通过函数指针或虚函数),那么要获得完整的调用图,您需要进行整个程序的别名分析。我们确实有一个选择,但这样的算法本质上是缓慢且不精确的,尤其是在预期是健全的情况下。
  • 是的,我们的工具在很多方面都与 Coverity Prevent 非常相似。他们当然是我们最大的竞争对手。
【解决方案3】:

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

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

对于 C、Java 和 COBOL,内置分析机制与语言定义相关联,因此您可以将这些分析器用作您可能想要构建的自定义分析的基础。 C++ 确实有符号表,但还没有与其他内部分析器绑定,但机器就在那里。

除此之外,DMS 还提供程序和源到源转换,以分析结果为条件;修改后的 AST 可以通过漂亮的打印来重新生成与原始 cmets 完整的可编译源。

你的三个问题:

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

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

2.你为什么使用它?

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

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

  • B-2 隐形轰炸机 JOVIAL-to-C 翻译器(说真的,请参阅网站)。
  • IBM 大型机应用架构提取。
  • 自动 C++ 组件重组。
  • 克隆检测。
  • 测试覆盖率和分析器
  • 智能差分器
  • (更多详细列表请参见网站)

【讨论】:

  • 鉴于 C++ 笨拙的语法,我猜 BNF 定义相当混乱,不是吗?
  • @Matthieu:C++ 语法非常接近 ANSI 手册中的定义,对各种方言(MS GCC ...)进行模调整以及我们对预处理器指令的特殊处理。你可以说 ANSI 的定义很混乱,但是语言就是语言。它似乎并不比 BNF 级别的 C# 或 Java 定义差多少。 C++ 真正糟糕的地方在于名称和类型解析的逻辑,例如,构建准确实现 Koenig 查找的符号表。 DMS 的一半价值在于这些东西已经完成。
  • 感谢您的回答。我将不得不检查一下。
  • 感谢您的回答,恭喜您成功解析C++ ;)
【解决方案4】:

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

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

NDepend.API 是 LINQ 友好的。超过200 code rules 被提议。它们基于 NDepend.API 上的 LINQ 查询,我们称之为 CQLinq 。这些代码规则涵盖了广泛的需求(API、进化/差异、命名、架构/设计、代码度量/质量、死代码、代码覆盖率、OOP...)您可以根据自己的需求调整它们并创建自己的那些。

14 Power Tools 提出了基于 NDepend.API 的开源基础。 Power Tools 实际上是自定义静态分析器。您也可以在这里调整它们或创建自己的。如果您下载 NDepend 位,这些 Power Tools 的代码源在 VisualStudio 解决方案中:$NDependInstallPath$\NDepend.PowerTools.SourceCode\NDepend.PowerTools.sln

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2012-10-04
    相关资源
    最近更新 更多