Add -fno-sanitize=vptr for SANITIZE_UNDEFINED=ON
authorStephan Beyer <s-beyer@gmx.net>
Mon, 18 May 2020 17:54:09 +0000 (19:54 +0200)
committerStephan Beyer <s-beyer@gmx.net>
Tue, 19 May 2020 08:57:58 +0000 (10:57 +0200)
The UndefinedBehaviorSanitizer includes the "vptr" check.  This
check, however, needs typeinfo for OCC::AccountManager because
otherwise its stub for FileManTest leads to undefined references
when linking.  Adding the -frtti flag to enable run-time typeinfo
did not solve the problem.  I do not know another solution, so this
commit disables the vptr check.

Signed-off-by: Stephan Beyer <s-beyer@gmx.net>
cmake/modules/SanitizerFlags.cmake

index 43319018257a570d3d098666afaec20e21dce863..d4818873c1036a49bc826999c80a203568a22e1f 100644 (file)
@@ -1,11 +1,16 @@
 # Enable address sanitizer (gcc/clang only)
 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
     set(SANITIZERS)
+    set(SANITIZER_EXTRA_FLAGS " -g")
 
     macro(add_sanitizer_option variable flag help)
         option(${variable} "Enable ${help}" OFF)
         if(${variable})
             list(APPEND SANITIZERS ${flag})
+            string(REPLACE ";" " " optional_args "${ARGN}")
+            if(optional_args)
+              string(APPEND SANITIZER_EXTRA_FLAGS " ${optional_args}")
+            endif()
         endif()
         mark_as_advanced(${variable})
     endmacro()
@@ -17,13 +22,14 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
     add_sanitizer_option(SANITIZE_MEMORY "memory"
         "MemorySanitizer (detects reads in uninitialized memory)")
     add_sanitizer_option(SANITIZE_UNDEFINED "undefined"
-        "UndefinedBehaviorSanitizer (detects undefined behavior)")
+        "UndefinedBehaviorSanitizer (detects undefined behavior)"
+        "-fno-sanitize=vptr")
     add_sanitizer_option(SANITIZE_THREAD "thread"
         "ThreadSanitizer (detects data races)")
 
     if(SANITIZERS)
         string(REPLACE ";" "," SANITIZER_FLAGS "${SANITIZERS}")
-        set(SANITIZER_FLAGS "-fsanitize=${SANITIZER_FLAGS}")
+        set(SANITIZER_FLAGS "-fsanitize=${SANITIZER_FLAGS}${SANITIZER_EXTRA_FLAGS}")
         string(APPEND CMAKE_CXX_FLAGS " ${SANITIZER_FLAGS}")
         string(APPEND CMAKE_C_FLAGS " ${SANITIZER_FLAGS}")
         string(APPEND CMAKE_EXE_LINKER_FLAGS " ${SANITIZER_FLAGS}")