From 13d94b32a0bf397da54e0e220204fa7e5175e5f5 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:34 -0400 Subject: [PATCH 1/6] Add options for TSan and UBSan --- cmake/snippets/flags-gnu.cmake | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cmake/snippets/flags-gnu.cmake b/cmake/snippets/flags-gnu.cmake index e31e5c03..7414095c 100644 --- a/cmake/snippets/flags-gnu.cmake +++ b/cmake/snippets/flags-gnu.cmake @@ -102,10 +102,23 @@ if (SPROKIT_ENABLE_CLANG_CATCH_UNDEFINED_BEHAVIOR) sprokit_want_compiler_flag(-fcatch-undefined-behavior) endif () -option(SPROKIT_ENABLE_ASAN "Enable address sanitization" OFF) +cmake_dependent_option(SPROKIT_ENABLE_ASAN "Enable address sanitization" OFF + "NOT SPROKIT_ENABLE_TSAN" OFF) +cmake_dependent_option(SPROKIT_ENABLE_TSAN "Enable thread sanitization" OFF + "NOT SPROKIT_ENABLE_ASAN" OFF) +option(SPROKIT_ENABLE_UBSAN "Enable undefined behavior sanitization" OFF) + if (SPROKIT_ENABLE_ASAN) - sprokit_check_compiler_flag(sprokit_warnings -fsanitize=address) - sprokit_check_compiler_flag(sprokit_warnings -fno-omit-frame-pointer) + sprokit_want_compiler_flag(-fsanitize=address) + sprokit_want_compiler_flag(-fno-omit-frame-pointer) +endif () + +if (SPROKIT_ENABLE_TSAN) + sprokit_want_compiler_flag(-fsanitize=thread) +endif () + +if (SPROKIT_ENABLE_UBSAN) + sprokit_want_compiler_flag(-fsanitize=undefined) endif () option(SPROKIT_ENABLE_COVERAGE "Build with coverage testing" OFF) From dcf3b541c3d9ea61eee5a2e989d49f7b4b89aaae Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:45 -0400 Subject: [PATCH 2/6] Avoid CMP0054 warning Annoying, but it's a nice thing to have, so I guess this is an acceptable loss of a quoted variable. --- cmake/snippets/flags.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/snippets/flags.cmake b/cmake/snippets/flags.cmake index 8fa703e6..50f8fe37 100644 --- a/cmake/snippets/flags.cmake +++ b/cmake/snippets/flags.cmake @@ -32,7 +32,7 @@ function (sprokit_want_compiler_flag flag) check_cxx_compiler_flag("${flag}" "have_compiler_flag-${safeflag}") - if ("have_compiler_flag-${safeflag}") + if (have_compiler_flag-${safeflag}) sprokit_add_flag("${flag}" ${ARGN}) endif () endfunction () From 3eaba7f54a18994e6f853ce8e519412224344759 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:46 -0400 Subject: [PATCH 3/6] Integrate sanitizer options with CTest Generate the dashboard script with the same options as the build for sanitizers and such. The inclusion of CTest must happen after the support scripts because they now set variables which are used in the DartConfiguration.tcl file. --- CMakeLists.txt | 3 +++ cmake/support/test.cmake | 23 +++++++++++++++++++++ conf/dashboard.ctest.in | 43 ++++++++++++++++++++++------------------ tests/CMakeLists.txt | 3 --- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d56905ee..9890d105 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,9 @@ endif () option(SPROKIT_ENABLE_TESTING "Build tests" OFF) if (SPROKIT_ENABLE_TESTING) + include("${sprokit_source_dir}/conf/sprokit-macro-tests.cmake") + include("${sprokit_source_dir}/cmake/support/test.cmake") + include(CTest) add_subdirectory(tests) diff --git a/cmake/support/test.cmake b/cmake/support/test.cmake index 39567e43..edfd6033 100644 --- a/cmake/support/test.cmake +++ b/cmake/support/test.cmake @@ -18,6 +18,29 @@ function (_sprokit_declare_tool_group tool) ${tool}) endfunction () +foreach (sanitizer ASAN TSAN UBSAN) + set("SPROKIT_SANITIZER_OPTIONS_${sanitizer}" "" + CACHE STRING "Options to set for ${sanitizer}") + mark_as_advanced("SPROKIT_SANITIZER_OPTIONS_${sanitizer}") +endforeach () + +set(memcheck_type "Valgrind") +set(sanitizer_options "") +if (SPROKIT_ENABLE_ASAN) + set(memcheck_type "AddressSanitizer") + set(sanitizer_options "${SPROKIT_SANITIZER_OPTIONS_ASAN}") +elseif (SPROKIT_ENABLE_TSAN) + set(memcheck_type "ThreadSanitizer") + set(sanitizer_options "${SPROKIT_SANITIZER_OPTIONS_TSAN}") +elseif (SPROKIT_ENABLE_UBSAN) + set(memcheck_type "UndefinedBehaviorSanitizer") + set(sanitizer_options "${SPROKIT_SANITIZER_OPTIONS_UBSAN}") +endif () +set(MEMORYCHECK_TYPE "${memcheck_type}" + CACHE INTERNAL "Memory tool expected to be used") +set(MEMORYCHECK_SANITIZER_OPTIONS "${sanitizer_options}" + CACHE INTERNAL "Options for the enabled sanitizer") + if (VALGRIND_EXECUTABLE) set(sprokit_valgrind_arguments) diff --git a/conf/dashboard.ctest.in b/conf/dashboard.ctest.in index f8dbb396..1263f526 100644 --- a/conf/dashboard.ctest.in +++ b/conf/dashboard.ctest.in @@ -39,7 +39,9 @@ set(CTEST_BUILD_NAME_BASE "@CDASH_BUILD_NAME@") set(SPROKIT_ENABLE_COVERAGE "@SPROKIT_ENABLE_COVERAGE@") set(CTEST_COVERAGE_COMMAND "@GCOV_EXECUTABLE@") -set(CTEST_MEMORYCHECK_COMMAND "@VALGRIND_EXECUTABLE@") +set(CTEST_MEMORYCHECK_TYPE "@MEMORYCHECK_TYPE@") +set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS "@MEMORYCHECK_SANITIZER_OPTIONS@") +set(CTEST_VALGRIND_COMMAND "@VALGRIND_EXECUTABLE@") ############################################################################### @@ -178,28 +180,31 @@ ctest_configure() ctest_build() ctest_test() -if (WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND) - set(valgrind_arguments) +if (WITH_MEMCHECK) + if (CTEST_MEMORYCHECK_TYPE STREQUAL "Valgrind" AND CTEST_VALGRIND_COMMAND) + set(valgrind_arguments) - list(APPEND valgrind_arguments - "--quiet") - list(APPEND valgrind_arguments - "--leak-check=yes") - list(APPEND valgrind_arguments - "--show-reachable=yes") - list(APPEND valgrind_arguments - "--num-callers=50") + list(APPEND valgrind_arguments + "--quiet") + list(APPEND valgrind_arguments + "--leak-check=yes") + list(APPEND valgrind_arguments + "--show-reachable=yes") + list(APPEND valgrind_arguments + "--num-callers=50") - file(GLOB valgrind_suppressions - "${CTEST_SOURCE_DIRECTORY}/tests/data/valgrind/*.supp") + file(GLOB valgrind_suppressions + "${CTEST_SOURCE_DIRECTORY}/tests/data/valgrind/*.supp") - foreach (valgrind_suppression IN LISTS valgrind_suppressions) - list(APPEND valgrind_arguments - "--suppressions=${valgrind_suppression}") - endforeach () + foreach (valgrind_suppression IN LISTS valgrind_suppressions) + list(APPEND valgrind_arguments + "--suppressions=${valgrind_suppression}") + endforeach () - set(CTEST_MEMORYCHECK_COMMAND_OPTIONS - "${valgrind_arguments}") + set(CTEST_MEMORYCHECK_COMMAND "${CTEST_VALGRIND_COMMAND}") + set(CTEST_MEMORYCHECK_COMMAND_OPTIONS + "${valgrind_arguments}") + endif () ctest_memcheck() endif () diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2d679145..d21158e9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,9 +14,6 @@ else () "${sprokit_binary_dir}/tests") endif () -include("${sprokit_source_dir}/conf/sprokit-macro-tests.cmake") -include("${sprokit_source_dir}/cmake/support/test.cmake") - set(sprokit_test_data_directory "${CMAKE_CURRENT_SOURCE_DIR}/data") From 883c102c17baee47b04d01cc1197bc26a6de627b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:46 -0400 Subject: [PATCH 4/6] Use the new CTest configuration file --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9890d105..903265b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ option(SPROKIT_ENABLE_TESTING "Build tests" OFF) if (SPROKIT_ENABLE_TESTING) include("${sprokit_source_dir}/conf/sprokit-macro-tests.cmake") include("${sprokit_source_dir}/cmake/support/test.cmake") + set(CTEST_NEW_FORMAT ON) include(CTest) From c3ce88698bc87c1553ef7b02d92616feac739bd5 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:46 -0400 Subject: [PATCH 5/6] Remove clang-specific variable If GCC ever supports it, don't assume it needs to masquerade as clang for it. --- cmake/snippets/flags-gnu.cmake | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmake/snippets/flags-gnu.cmake b/cmake/snippets/flags-gnu.cmake index 7414095c..be95a403 100644 --- a/cmake/snippets/flags-gnu.cmake +++ b/cmake/snippets/flags-gnu.cmake @@ -96,9 +96,8 @@ if (SPROKIT_ENABLE_WERROR) sprokit_want_compiler_flag(-Werror) endif () -cmake_dependent_option(SPROKIT_ENABLE_CLANG_CATCH_UNDEFINED_BEHAVIOR "Use clang to flag undefined behavior" OFF - sprokit_using_clang OFF) -if (SPROKIT_ENABLE_CLANG_CATCH_UNDEFINED_BEHAVIOR) +option(SPROKIT_ENABLE_CATCH_UNDEFINED_BEHAVIOR "Flag undefined behavior" OFF) +if (SPROKIT_ENABLE_CATCH_UNDEFINED_BEHAVIOR) sprokit_want_compiler_flag(-fcatch-undefined-behavior) endif () From 5099b5c5412967a7c584e754b285f614d1323306 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 3 Oct 2014 12:33:47 -0400 Subject: [PATCH 6/6] Lock down the build types allowed --- cmake/snippets/configuration.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/snippets/configuration.cmake b/cmake/snippets/configuration.cmake index 30add68b..13e7350a 100644 --- a/cmake/snippets/configuration.cmake +++ b/cmake/snippets/configuration.cmake @@ -4,6 +4,12 @@ # "SPROKIT_CONFIGURATION=\"$\"" # "SPROKIT_CONFIGURATION_L=L\"$\"") +if (DEFINED CMAKE_BUILD_TYPE) + set_property(CACHE CMAKE_BUILD_TYPE + PROPERTY + STRINGS "Release;Debug;RelWithDebInfo;MinSizeRel") +endif () + # XXX(cmake): 2.8.12 foreach (config IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER "${config}" upper_config)