或者我必须使用单独的构建吗?-fsanitize标志只允许地址或线程,但是否允许多个?
对
不,不可能将AddressSanitizer和ThreadSanitizer组合到一个构建中(但其他组合是可能的)。您需要多次构建
-fsanitize =地址
启用AddressSanitizer,一个快速内存错误检测器。内存访问指令用于检测越界和use-after-free bug。该选项启用-fsanitize-address-use-after-scope。更多信息请参见https://github.com/google/sanitizers/wiki/AddressSanitizer细节。控件可以影响运行时行为ASAN_OPTIONS环境变量。当设置为help=1时,表示可用选项在仪表程序启动时显示。看到https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags以获取支持的选项列表。该选项不能与-fsanitize=thread或-fsanitize=hwaddress。请注意,目前唯一支持的目标-fsanitize=hwaddress是AArch64。
-fsanitize =线程
启用ThreadSanitizer,一个快速的数据竞争检测器。内存访问指令是用来检测数据竞争错误的。看到https://github.com/google/sanitizers/wiki#threadsanitizer获取更多信息细节。控件可以影响运行时行为TSAN_OPTIONS环境变量;看到https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags for a支持的选项列表。该选项不能与-fsanitize =地址,-fsanitize =泄漏.
注意,当使用非调用异常操作无效内存地址时,经过消毒的原子内置程序不能抛出异常(-fnon-call-exceptions)。
https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html