diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index 4ce7f57403c..1825b55ed54 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -555,6 +555,8 @@ if(LLVM_USE_SANITIZER) append_common_sanitizer_flags() append("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + append("-fsanitize-blacklist=${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt" + CMAKE_C_FLAGS CMAKE_CXX_FLAGS) elseif (LLVM_USE_SANITIZER STREQUAL "Thread") append_common_sanitizer_flags() append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) diff --git a/utils/sanitizers/ubsan_blacklist.txt b/utils/sanitizers/ubsan_blacklist.txt new file mode 100644 index 00000000000..49975866ea4 --- /dev/null +++ b/utils/sanitizers/ubsan_blacklist.txt @@ -0,0 +1,7 @@ +# This blacklist should be applied when LLVM is built +# with -fsanitize=undefined instrumentation. It exists +# because libstdc++ has some undefined behavior issues +# in some of the headers, in particular, stl_tree.h. + +# upcast of address with insufficient space for an object of type std::_Rb_tree_node<...> +src:*bits/stl_tree.h