diff options
author | Florian Walch <florian@fwalch.com> | 2015-06-08 19:49:23 +0300 |
---|---|---|
committer | Florian Walch <florian@fwalch.com> | 2015-07-05 10:31:16 +0300 |
commit | bd9042b1a99f0a7c710d825c9be91280437348ed (patch) | |
tree | 1ce214d3fdc82c5ffdf40a2ddf976e52aa49b848 | |
parent | 1d9501186c2e97c3ea9004e86ff6744fef9ef957 (diff) | |
download | rneovim-bd9042b1a99f0a7c710d825c9be91280437348ed.tar.gz rneovim-bd9042b1a99f0a7c710d825c9be91280437348ed.tar.bz2 rneovim-bd9042b1a99f0a7c710d825c9be91280437348ed.zip |
CMake: Add option for Clang MSan.
-rw-r--r-- | .ci/clang.sh | 10 | ||||
-rw-r--r-- | .travis.yml | 5 | ||||
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | src/nvim/CMakeLists.txt | 10 |
4 files changed, 29 insertions, 11 deletions
diff --git a/.ci/clang.sh b/.ci/clang.sh index b2d9dd3a7a..605a7647c8 100644 --- a/.ci/clang.sh +++ b/.ci/clang.sh @@ -2,8 +2,13 @@ sudo pip install cpp-coveralls -# Use custom Clang and enable ASAN on Linux. +# Use custom Clang and enable sanitizers on Linux. if [ "$TRAVIS_OS_NAME" = "linux" ]; then + if [ -z "$CLANG_SANITIZER" ]; then + echo "CLANG_SANITIZER not set." + exit 1 + fi + clang_version=3.4.2 clang_suffix=x86_64-unknown-ubuntu12.04.xz if [ ! -d /usr/local/clang-$clang_version ]; then @@ -15,13 +20,14 @@ if [ "$TRAVIS_OS_NAME" = "linux" ]; then export CC=/usr/local/clang-$clang_version/bin/clang symbolizer=/usr/local/clang-$clang_version/bin/llvm-symbolizer export ASAN_SYMBOLIZER_PATH=$symbolizer + export MSAN_SYMBOLIZER_PATH=$symbolizer export ASAN_OPTIONS="detect_leaks=1:log_path=$tmpdir/asan" export TSAN_OPTIONS="external_symbolizer_path=$symbolizer:log_path=$tmpdir/tsan" export UBSAN_OPTIONS="log_path=$tmpdir/ubsan" # not sure if this works CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \ -DUSE_GCOV=ON \ -DBUSTED_OUTPUT_TYPE=plainTerminal \ - -DSANITIZE=ON" + -DCLANG_${CLANG_SANITIZER}=ON" else CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \ -DUSE_GCOV=ON \ diff --git a/.travis.yml b/.travis.yml index fb4c69c21b..687e8e89ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,13 +20,16 @@ env: # Force verification of DLOG macros. - CFLAGS='-DMIN_LOG_LEVEL=0' matrix: - - CI_TARGET=clang - CI_TARGET=gcc - CI_TARGET=gcc-32 - CI_TARGET=clint - CI_TARGET=mingw matrix: include: + - os: linux + env: CI_TARGET=clang CLANG_SANITIZER=ASAN + - os: linux + env: CI_TARGET=clang CLANG_SANITIZER=MSAN - os: osx env: CI_TARGET=clang compiler: clang diff --git a/CMakeLists.txt b/CMakeLists.txt index 88331490b8..949ae163af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,13 +191,18 @@ include_directories(SYSTEM ${LIBTERMKEY_INCLUDE_DIRS}) find_package(LibVterm REQUIRED) include_directories(SYSTEM ${LIBVTERM_INCLUDE_DIRS}) -option(SANITIZE "Enable Clang sanitizers for nvim binary" OFF) -if(SANITIZE AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang") - message(WARNING "SANITIZE is only supported for Clang, disabling") - set(SANITIZE OFF) +option(CLANG_ASAN "Enable Clang address sanitizer for nvim binary." OFF) +option(CLANG_MSAN "Enable Clang memory sanitizer for nvim binary." OFF) +if(CLANG_ASAN AND CLANG_MSAN) + message(FATAL_ERROR "CLANG_ASAN and CLANG_MSAN cannot be enabled simultaneously.") +endif() +if((CLANG_ASAN OR CLANG_MSAN) AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang") + message(FATAL_ERROR "Sanitizers are only supported for Clang.") endif() -if(NOT SANITIZE) +if(CLANG_ASAN OR CLANG_MSAN) + message(STATUS "Sanitizers have been enabled; don't use jemalloc.") +else() find_package(JeMalloc) if(JEMALLOC_FOUND) include_directories(SYSTEM ${JEMALLOC_INCLUDE_DIRS}) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 880ff42ba5..19121ad8e7 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -95,7 +95,7 @@ foreach(gen_cdef ${gen_cdefs} DO_NOT_DEFINE_EMPTY_ATTRIBUTES) list(APPEND gen_cflags "-D${gen_cdef}") endif() endforeach() -if (SANITIZE) +if(CLANG_ASAN) list(APPEND gen_cflags "-DEXITFREE") endif() @@ -190,11 +190,15 @@ add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES}) install_helper(TARGETS nvim) -if(SANITIZE) - message(STATUS "Enabling Clang sanitizers for nvim") +if(CLANG_ASAN) + message(STATUS "Enabling Clang address sanitizer for nvim.") set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-DEXITFREE ") set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-fno-sanitize-recover -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address -fsanitize=undefined ") set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=address -fsanitize=undefined ") +elseif(CLANG_MSAN) + message(STATUS "Enabling Clang memory sanitizer for nvim.") + set_property(TARGET nvim APPEND_STRING PROPERTY COMPILE_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -fno-optimize-sibling-calls ") + set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=memory -fsanitize-memory-track-origins ") endif() add_library(libnvim STATIC EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES} |