【问题标题】:How to get GCC/Clang to error on reserved identifiers如何让 GCC/Clang 在保留标识符上出错
【发布时间】: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 可执行文件。

标签: c++ linter


【解决方案1】:

Clang 从版本 13 开始具有此功能,带有 -Wreserved-identifier 标志 (link)。

GCC 尚未实现此类功能(如 2022 年 3 月)。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多