From ef6a03128ab2d4c0d813ec888d23d0fb6aac3b04 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 10 Oct 2016 19:17:21 +0200 Subject: [PATCH] Added memory and thread sanitizer. --- CMakeLists.txt | 54 +++++++++++++++++++++---- cmake/ClangToolchain.cmake | 16 ++++++++ cmake/ConfigOptions.cmake | 11 +++-- scripts/blacklist-address-sanitizer.txt | 0 scripts/blacklist-memory-sanitizer.txt | 1 + scripts/blacklist-thread-sanitizer.txt | 0 6 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 cmake/ClangToolchain.cmake create mode 100644 scripts/blacklist-address-sanitizer.txt create mode 100644 scripts/blacklist-memory-sanitizer.txt create mode 100644 scripts/blacklist-thread-sanitizer.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d9d3382f..a8f23b526 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,7 +335,14 @@ if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC) set(CMAKE_REQUIRED_FLAGS "-fsanitize=address") CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address) if(fsanitize-address) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") + if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt") + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + else() + message(FATAL_ERROR "Missing support for address sanitizer!") endif() if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS) set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS}) @@ -347,14 +354,47 @@ if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC) if(fno-omit-frame-pointer) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer") endif() - elseif(WITH_SANITIZE_LEAK) + elseif(WITH_SANITIZE_MEMORY) if (DEFINED CMAKE_REQUIRED_FLAGS) set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) endif() - set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak") - CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak) - if(fsanitize-leak) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak") + set(CMAKE_REQUIRED_FLAGS "-fsanitize=memory") + CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory) + if(fsanitize-memory) + if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt") + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory") + else() + message(FATAL_ERROR "Missing support for memory sanitizer!") + endif() + if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS}) + else() + unset(CMAKE_REQUIRED_FLAGS) + endif() + + CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer) + if(fno-omit-frame-pointer) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer") + endif() + elseif(WITH_SANITIZE_THREAD) + if (DEFINED CMAKE_REQUIRED_FLAGS) + set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + endif() + set(CMAKE_REQUIRED_FLAGS "-fsanitize=thread") + CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread) + if(fsanitize-thread) + if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt") + endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread") + else() + message(FATAL_ERROR "Missing support for thread sanitizer!") endif() if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS) set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS}) @@ -434,7 +474,7 @@ if(WIN32) elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*") set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}") else() - message(FATAL "Unknown generator ${CMAKE_GENERATOR}") + message(FATAL_ERROR "Unknown generator ${CMAKE_GENERATOR}") endif() # Set product and vendor for dll and exe version information. diff --git a/cmake/ClangToolchain.cmake b/cmake/ClangToolchain.cmake new file mode 100644 index 000000000..d781bab86 --- /dev/null +++ b/cmake/ClangToolchain.cmake @@ -0,0 +1,16 @@ +if ($ENV{CLANG_VERSION}) + SET (CLANG_VERSION "-$ENV{CLANG_VERSION}") +endif() + +SET (CMAKE_C_COMPILER "/usr/bin/clang${CLANG_VERSION}" CACHE PATH "") +SET (CMAKE_C_FLAGS "-pedantic -Wall -std=gnu99" CACHE STRING "") +SET (CMAKE_C_FLAGS_DEBUG "-g" CACHE STRING "") +SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING "") +SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG" CACHE STRING "") +SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "") + +SET (CMAKE_AR "/usr/bin/llvm-ar${CLANG_VERSION}" CACHE PATH "") +SET (CMAKE_LINKER "/usr/bin/llvm-link${CLANG_VERSION}" CACHE PATH "") +SET (CMAKE_NM "/usr/bin/llvm-nm${CLANG_VERSION}" CACHE PATH "") +SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump${CLANG_VERSION}" CACHE PATH "") +SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib${CLANG_VERSION}" CACHE PATH "") diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index ae6b69021..ce5b61ce8 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -42,9 +42,14 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif() if(NOT WIN32) - CMAKE_DEPENDENT_OPTION(WITH_VALGRIND_MEMCHECK "Compile with valgrind helpers." OFF "NOT WITH_SANITIZE_ADDRESS; NOT WITH_SANITIZE_LEAK" OFF) - CMAKE_DEPENDENT_OPTION(WITH_SANITIZE_ADDRESS "Compile with gcc/clang address sanitizer." OFF "NOT WITH_VALGRIND_MEMCHECK; NOT WITH_SANITIZE_LEAK" OFF) - CMAKE_DEPENDENT_OPTION(WITH_SANITIZE_LEAK "Compile with gcc/clang leak sanitizer." OFF "NOT WITH_VALGRIND_MEMCHECK; NOT WITH_SANITIZE_ADDRESS" OFF) + CMAKE_DEPENDENT_OPTION(WITH_VALGRIND_MEMCHECK "Compile with valgrind helpers." OFF + "NOT WITH_SANITIZE_ADDRESS; NOT WITH_SANITIZE_MEMORY; NOT WITH_SANITIZE_THREAD" OFF) + CMAKE_DEPENDENT_OPTION(WITH_SANITIZE_ADDRESS "Compile with gcc/clang address sanitizer." OFF + "NOT WITH_VALGRIND_MEMCHECK; NOT WITH_SANITIZE_MEMORY; NOT WITH_SANITIZE_THREAD" OFF) + CMAKE_DEPENDENT_OPTION(WITH_SANITIZE_MEMORY "Compile with gcc/clang memory sanitizer." OFF + "NOT WITH_VALGRIND_MEMCHECK; NOT WITH_SANITIZE_ADDRESS; NOT WITH_SANITIZE_THREAD" OFF) + CMAKE_DEPENDENT_OPTION(WITH_SANITIZE_THREAD "Compile with gcc/clang thread sanitizer." OFF + "NOT WITH_VALGRIND_MEMCHECK; NOT WITH_SANITIZE_ADDRESS; NOT WITH_SANITIZE_MEMORY" OFF) else() if(NOT UWP) option(WITH_MEDIA_FOUNDATION "Enable H264 media foundation decoder." ON) diff --git a/scripts/blacklist-address-sanitizer.txt b/scripts/blacklist-address-sanitizer.txt new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/blacklist-memory-sanitizer.txt b/scripts/blacklist-memory-sanitizer.txt new file mode 100644 index 000000000..9a05abbdb --- /dev/null +++ b/scripts/blacklist-memory-sanitizer.txt @@ -0,0 +1 @@ +fun:RAND* diff --git a/scripts/blacklist-thread-sanitizer.txt b/scripts/blacklist-thread-sanitizer.txt new file mode 100644 index 000000000..e69de29bb