【问题标题】:Is there a way to detect compiler -fxxxx flags in C++ code in clang?有没有办法在clang中检测C++代码中的编译器-fxxxx标志?
【发布时间】:2021-09-30 07:43:28
【问题描述】:

有没有办法在clang中检测C++代码中的编译器-fxxxx标志?

我不想以二进制形式存储整个命令行,我想测试一个单独的选项。

如果指定了某些标志以避免代码在运行时崩溃,我希望它提供编译错误或警告。

【问题讨论】:

  • 哪个标志以及为什么会崩溃?
  • @Richard,它是-fdelete-null-pointer-checks,由于很久以前编写代码时所做的无效假设而崩溃
  • @Galik,不完全是。该问题询问有关在运行时查询选项的问题,而答案对编译时检查无济于事

标签: c++ clang clang++


【解决方案1】:

没有很好的方法来检测 C++ 代码中标志的存在。

编译器不会将此标志的存在传达给代码。

您可以编写一些代码来根据标志的存在来改变行为,但是这样做非常脆弱,并且不能保证实际工作。有意将 UB 引入您的程序并不是一个特别好的主意。但是如果你想这样做,那就是这样的事情:

void mark_nonnull(__attribute__((nonnull)) int* p) {}
bool deletes_checks_2(int* p) __attribute__((noinline)) {
  mark_nonnull(p);
  if (p) return true;
  else return false;
}
bool deletes_checks() { return deletes_checks_2(nullptr); }

一个更好的主意是在构建系统级别拦截它。您可以添加一条规则,将测试文件编译到类似于以下内容的 LLVM IR:https://reviews.llvm.org/differential/changeset/?ref=1123266 然后您检查生成的 IR(如果存在),如果不存在则中止构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2021-11-29
    • 2020-10-06
    相关资源
    最近更新 更多