c++ 如何用g++检测ubsan的存在

8mmmxcuj  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一些有效的C代码,不能在ubsan下用g编译。简而言之(https://gcc.godbolt.org/z/9qvz89na8):

struct foo {
  void bar() { }
};

void process(auto f) {
  if constexpr(&decltype(f)::bar);
}

int main() {
  process(foo{});
}

字符串
产量

In instantiation of 'void process(auto:1) [with auto:1 = foo]':
error: '(foo::bar != 0)' is not a constant expression


因此,我想检测我是否在ubsan下构建,试图通过使if constexpr有条件地constexpr来缓解这个问题。
这在clang下是微不足道的,但在g++中,当我尝试查看预定义的宏时:

echo | g++ -fsanitize=undefined -dM -E -


我看不出任何暗示ubsan已启用的内容。有没有办法检测到这一点?

oo7oh9g9

oo7oh9g91#

这里有一个Oracle,似乎工作。

template<class T>
concept Check = sizeof(int[&T::bar != nullptr]) == sizeof(int[true]);

字符串
参见:https://gcc.godbolt.org/z/jra1bbY43完整示例。

相关问题