From 6aa4eee0f47b460f9863a8cba602fc3166d35a42 Mon Sep 17 00:00:00 2001 From: Nils Wentzell Date: Tue, 24 Apr 2018 23:31:52 +0200 Subject: [PATCH] [cmake] Fixing usage of ubsan with Minimal RT, some cleaning - Use UBsan Minimal RT if found - Prioritize gcc-7 directories over older - Set UBSan options for c++/python tests --- share/cmake/Findlibasan_rt.cmake | 1 + share/cmake/Findlibubsan_rt.cmake | 33 +++++++++++++++++++++---------- test/c++/CMakeLists.txt | 6 ++++++ test/python/CMakeLists.txt | 8 +++++++- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/share/cmake/Findlibasan_rt.cmake b/share/cmake/Findlibasan_rt.cmake index 7e0c0f56..60828a3a 100644 --- a/share/cmake/Findlibasan_rt.cmake +++ b/share/cmake/Findlibasan_rt.cmake @@ -31,6 +31,7 @@ find_library(ASAN_RT_LIBRARY ENV LD_INCLUDE_PATH /usr/lib /usr/local/lib + /usr/lib/gcc/*/7 /usr/lib/gcc/*/* /usr/lib/clang/*/lib/linux /usr/lib/llvm-*/lib/clang/*/lib/linux diff --git a/share/cmake/Findlibubsan_rt.cmake b/share/cmake/Findlibubsan_rt.cmake index a22990ae..8b6dc7e5 100644 --- a/share/cmake/Findlibubsan_rt.cmake +++ b/share/cmake/Findlibubsan_rt.cmake @@ -14,7 +14,20 @@ # # Results are reported in:: # -# UBSAN_RT_LIBRARY Undefined Behavior Sanitizer Runtime Library +# UBSAN_RT_LIBRARY Undefined Behavior Sanitizer Runtime Library +# [UBSAN_MINIMAL_RT_LIBRARY] Minimal version of UBSan Runtime, To be used in combination with Asan + +set(TRIAL_PATHS + ENV LIBRARY_PATH + ENV LD_INCLUDE_PATH + /usr/lib + /usr/local/lib + /usr/lib/gcc/7/* + /usr/lib/gcc/*/* + /usr/lib/clang/*/lib/linux + /usr/lib/llvm-*/lib/clang/*/lib/linux + /usr/local/opt/llvm/lib/clang/*/lib/darwin +) if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") set(name clang_rt.ubsan_standalone-x86_64) @@ -26,17 +39,17 @@ endif() find_library(UBSAN_RT_LIBRARY NAMES ${name} - PATHS - ENV LIBRARY_PATH - ENV LD_INCLUDE_PATH - /usr/lib - /usr/local/lib - /usr/lib/gcc/*/* - /usr/lib/clang/*/lib/linux - /usr/lib/llvm-*/lib/clang/*/lib/linux - /usr/local/opt/llvm/lib/clang/*/lib/darwin + PATHS ${TRIAL_PATHS} ) +# Try to find UBSan Minimal Runtime for Clang +if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + find_library(UBSAN_MINIMAL_RT_LIBRARY + NAMES clang_rt.ubsan_minimal-x86_64 + PATHS ${TRIAL_PATHS} + ) +endif() + mark_as_advanced(UBSAN_RT_LIBRARY) # Imported target diff --git a/test/c++/CMakeLists.txt b/test/c++/CMakeLists.txt index f6f8aad3..b445b900 100644 --- a/test/c++/CMakeLists.txt +++ b/test/c++/CMakeLists.txt @@ -26,3 +26,9 @@ foreach(t ${all_tests}) ) endif() endforeach() + +# Set UBSan Options for all tests +set_property(TEST ${all_tests} PROPERTY + ENVIRONMENT + UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1 +) diff --git a/test/python/CMakeLists.txt b/test/python/CMakeLists.txt index efdef3bd..c1241802 100644 --- a/test/python/CMakeLists.txt +++ b/test/python/CMakeLists.txt @@ -8,9 +8,15 @@ foreach(t ${all_tests}) add_test(NAME ${t} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/${t}.py) endforeach() -# Set the PythonPath and the Sanitizer Library Preloads +# If ASAN=ON use minimal runtime of UBSAN if it exists +if(${ASAN} AND UBSAN_MINIMAL_RT_LIBRARY) + set(UBSAN_RT_LIBRARY ${UBSAN_MINIMAL_RT_LIBRARY}) +endif() + +# Set the PythonPath, Sanitizer Library Preloads and UBSan Options for all tests set_property(TEST ${all_tests} PROPERTY ENVIRONMENT PYTHONPATH=${CMAKE_BINARY_DIR}/python:$ENV{PYTHONPATH} LD_PRELOAD=$<$:${ASAN_RT_LIBRARY}>:$<$:${UBSAN_RT_LIBRARY}> + UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1 )