https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84250
Bug ID: 84250 Summary: Symbol collision when using both Address and Undefined Behavior sanitizers (-fsanitize=address,undefined) Product: gcc Version: 6.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: sanitizer Assignee: unassigned at gcc dot gnu.org Reporter: pedronavf at gmail dot com CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org, jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at gcc dot gnu.org Target Milestone: --- When using both Address and Undefined Behavior sanitizers (-fsanitize=address,undefined ) the reporting functions, like __sanitizer_set_report_path, get called only for Address Sanitizer. Because both sanitizers statically link libsanitizer_common (where the __report_* functions are) both libraries have the __sanitizer_set_report_path symbol and the linker resolves the call to the one in libasan.so. Also, this issue is the one that causes UBSAN_OPTIONS to not respect the "log_path" flag when using both sanitizers. Clang's approach is to embed ubsan in asan when using both sanitizers (https://github.com/google/sanitizers/issues/912). Test program (test.cpp) #include <sanitizer/common_interface_defs.h> int main(int argc, char **argv) { __sanitizer_set_report_path("/tmp/sanitizer.txt"); int i = 23; i <<= 32; int *array = new int[100]; delete [] array; return array[argc]; } Compile: g++ -O -g -fsanitize=address test.cpp (works) g++ -O -g -fsanitize=undefined test.cpp (works) g++ -O -g -fsanitize=address,undefined test.cpp (doesn't work!) This program triggers both asan and ubsan. When using -fsanitize=address or -fsanitize=undefined the sanitizer output is correctly written to /tmp/sanitizer.txt.<pid>. When using both sanitizers, only asan's gets written to file; ubsan output goes to stderr. The same thing happens when linking the sanitizers statically (-static-libasan -static-libubsan), but I found out that using __sanitizer_set_report_path never works for ubsan when linking statically: g++ -O -g -fsanitize=undefined test.cpp -static-libubsan