【发布时间】:2022-03-30 13:55:58
【问题描述】:
在大型代码库中,维护者/项目所有者可能无法审查和审核每一行代码。在C++中,有些标识符是保留的(按照标准),禁止定义保留标识符似乎是合理的。
根据Identifiers - cppreference.com:
- 任何地方带有双下划线的标识符都是保留的;
- 以下划线后跟大写字母的标识符被保留;
- 以下划线开头的标识符保留在全局命名空间中。
是否有工具可以强制执行此准则(禁止使用保留标识符)?
例如,是否有可能(通过 GCC、Clang、clang-tidy 或其他一些编译器或 linter)得到类似以下 sn-p 的代码到错误:
auto __destination = cv::Mat3f(1, 1);
cv::cvtColor(source, __destination, cv::ColorConversionCodes::COLOR_HSV2RGB);
auto result = __destination.at<cv::Vec3f>(0, 0);
我知道我可以通过针对代码库测试一些正则表达式来解决这个问题,甚至可以通过将 C++ 代码解析为解析树然后验证所有标识符来体面地解决它,但我有兴趣知道是否存在已经可以做到这一点了。
我有兴趣禁止使用以双下划线开头的已定义变量,例如,这可能是利用 GCC leaky abstraction 的黑客攻击。
【问题讨论】:
-
clang -Weverything没有对此发出警告,所以我想这对 clang 来说是不行的。 -
clang-tidy 包含一个不错的方式来实现额外的自定义检查,但它需要编译一个新的 clang-tidy 可执行文件。