我们使用以下代码来确定是否-fsanitize=address在编译时为clang和gcc指定了.我们如何确定是否-fsanitize=undefined已指定?
bool isSanitized = false;
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
isSanitized = true;
#endif
#elif defined(__SANITIZE_ADDRESS__)
isSanitized = true;
#endif
Run Code Online (Sandbox Code Playgroud) 如何检测使用 gcc 5 的构建是否已打开线程清理程序?两者之间的任何一个__has_feature(thread_sanitizer)都不__SANITIZE_THREAD__工作
#include <iostream>
using std::cout;
using std::endl;
int main() {
cout << __has_feature(thread_sanitizer) << endl;
cout << __SANITIZE_THREAD__ << endl;
}
Run Code Online (Sandbox Code Playgroud)
https://wandbox.org/permlink/t5qYme4Whyj54aYV。这在具有线程清理程序的 clang 版本上进行编译;但不适用于某些 gcc 版本(特别是 5)
功能检查和__SANITIZE_THREAD__宏都可用于检测线程清理程序何时打开,因此测试可以抑制误报(例如,当线程清理程序捕获实际上不是数据争用的错误时)请参阅此了解更多信息
我有几个版本的项目结帐和编译。如果我发现错误,我会比较版本以缩小问题范围。有时我会启用像 AddressSanitizer 这样的消毒剂。如果我重新使用一个可执行文件,我不记得它是否是用消毒剂编译的。如果可执行文件工作正常,我不确定该错误是否不存在,或者我是否没有在此版本中包含消毒剂。所以我必须重新配置和重建以确保我有消毒剂。
有没有办法检查可执行文件是否已使用消毒剂编译?