如何计算在具有特定类型操作数的代码库中使用重载运算符的次数

0x9*_*7c8 5 c++ templates static-analysis metaprogramming clang-static-analyzer

我有一个模板类SafeInt<T> (由微软提供)。

理论上,此类可以用来代替 POD 整数类型,并且可以检测算术运算期间的任何整数溢出。

对于这个类,我编写了一些自定义模板化重载算术运算符(+、-、*、/)函数,其两个参数都是SafeInt<T>.

我将所有整数类型类型定义为 SafeInt 类类型。

我想在我的代码库中搜索所述二元运算符的实例,其中两个操作数都是 SafeInt 类型。

我能想到的一些方法

  1. 使用正则表达式进行字符串搜索并清除代码以检测两个操作数都是 SafeInt 对象的运算符使用实例。

  2. 编写一个 clang 工具并处理 AST 来执行此搜索(我还没有学会如何编写这样的工具。)

  3. 以某种方式添加一个计数器来计算自定义重载运算符实例化的次数。我花了很多时间尝试这个但似乎不起作用。

有人能建议更好的方法吗?

如果我需要澄清任何事情,请告诉我。

谢谢。

Ira*_*ter 0

为了正确地做到这一点,您显然必须能够识别重载到特定运算符定义的运算符的单独使用。从根本上讲,您需要 C++ 编译器前端的功能:解析和名称解析(包括重载)。

显然GCC和Clang都具备这个基本能力。但您想要跟踪/显示特定操作员的所有使用情况。您可能可以使用 Clang(或 GCC,更难)来逐个文件地提供此信息。

我们的DMS 软件重组工具包及其C++ 前端也可用于此目的。DMS 提供通用解析和符号表支持机制;C++ 前端专门使用 DMS 来处理 C++,并为 GCC5 和 MSVS2015 提供完整、准确的名称解析(包括重载)。它的符号表实际上收集了范围内的每个声明、声明点以及该声明在准确源位置方面的使用列表。符号范围包括该范围内有效的每个(重载)运算符的条目。您只需转到所需的符号表条目并枚举/计算引用列表即可获取原始计数。可通过 DMS 获取这方面的标准 API。

我们的Java 源浏览器使用相同类型的符号范围/定义/使用信息来构建基于 HTML 的类似 JavaDoc 的显示,并在符号声明和使用之间具有完整的 HTML 链接。因此对于任何符号声明,您都可以轻松查看其用途。

C++ 前端有一个类似的 HTMLizer,可在 C++ 源代码上运行。它不是那么成熟/漂亮,但它很强大。目前它并未显示已声明符号的所有用途,但这将是对其进行非常简单的更改。(我没有公开可见的实例。通过我的简历与我联系,我可以向您发送样本)。