From 68123963f3f6ed0447459cb86e87f330dfe26ffd Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 28 Sep 2017 15:53:22 +0200 Subject: [PATCH] Check if ASan is enabled from CMake, and define variables. HAVE_SANITIZE_ADDRESS if AddressSanitizer is enabled HAVE_SANITIZE_ADDRESS_FIBER_SUPPORT if current ASan version includes Fiber annotation interface Update smpi_memory.cpp in consequence. --- CMakeLists.txt | 10 +++++----- src/smpi/internals/smpi_memory.cpp | 16 ++++++--------- tools/cmake/DefinePackages.cmake | 1 + tools/cmake/GCCFlags.cmake | 6 ++++++ tools/cmake/src/internal_config.h.in | 6 +++++- tools/cmake/test_prog/prog_asan.cpp | 29 ++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 tools/cmake/test_prog/prog_asan.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 342de40b88..e2bb276f16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -675,6 +675,11 @@ else() set(GIT_VERSION "none, release version") endif() +### Setup gcc & clang flags +if (NOT MSVC) + include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake) +endif() + ### Generate the required headers and scripts ############################################# @@ -866,11 +871,6 @@ include(${CMAKE_HOME_DIRECTORY}/tools/cmake/DefinePackages.cmake) include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MaintainerMode.cmake) include(${CMAKE_HOME_DIRECTORY}/tools/cmake/UnitTesting.cmake) -### Setup gcc & clang flags -if (NOT MSVC) - include(${CMAKE_HOME_DIRECTORY}/tools/cmake/GCCFlags.cmake) -endif() - ### Make Libs if(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/tools/cmake/MakeLib.cmake) diff --git a/src/smpi/internals/smpi_memory.cpp b/src/smpi/internals/smpi_memory.cpp index 67de25e7d8..fcc5cc2751 100644 --- a/src/smpi/internals/smpi_memory.cpp +++ b/src/smpi/internals/smpi_memory.cpp @@ -21,6 +21,7 @@ #include #include +#include "src/internal_config.h" #include "src/xbt/memory_map.hpp" #include "private.h" @@ -68,14 +69,9 @@ void smpi_get_executable_global_size() } #endif -#if defined(__has_feature) -#define HAS_FEATURE(x) __has_feature(x) -#else -#define HAS_FEATURE(x) 0 -#endif -#if HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +#if HAVE_SANITIZE_ADDRESS #include -static void* safe_memcpy(void* dest, void* src, size_t n) +static void* asan_safe_memcpy(void* dest, void* src, size_t n) { char* psrc = static_cast(src); char* pdest = static_cast(dest); @@ -92,7 +88,7 @@ static void* safe_memcpy(void* dest, void* src, size_t n) return dest; } #else -#define safe_memcpy(dest, src, n) memcpy(dest, src, n) +#define asan_safe_memcpy(dest, src, n) memcpy(dest, src, n) #endif /** Map a given SMPI privatization segment (make a SMPI process active) */ @@ -117,7 +113,7 @@ void smpi_really_switch_data_segment(int dest) #if HAVE_PRIVATIZATION if(smpi_loaded_page==-1){//initial switch, do the copy from the real page here for (int i=0; i< smpi_process_count(); i++){ - safe_memcpy(smpi_privatization_regions[i].address, TOPAGE(smpi_start_data_exe), smpi_size_data_exe); + asan_safe_memcpy(smpi_privatization_regions[i].address, TOPAGE(smpi_start_data_exe), smpi_size_data_exe); } } @@ -198,7 +194,7 @@ Ask the Internet about tutorials on how to increase the files limit such as: htt xbt_die("Impossible to unlink temporary file for memory mapping"); // initialize the values - safe_memcpy(address, TOPAGE(smpi_start_data_exe), smpi_size_data_exe); + asan_safe_memcpy(address, TOPAGE(smpi_start_data_exe), smpi_size_data_exe); // store the address of the mapping for further switches smpi_privatization_regions[i].file_descriptor = file_descriptor; diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 7280d5da8e..247836ac98 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -1050,6 +1050,7 @@ set(CMAKE_SOURCE_FILES tools/cmake/scripts/update_tesh.pl tools/cmake/UnitTesting.cmake tools/cmake/src/internal_config.h.in + tools/cmake/test_prog/prog_asan.cpp tools/cmake/test_prog/prog_gnu_dynlinker.c tools/cmake/test_prog/prog_makecontext.c tools/cmake/test_prog/prog_mutex_timedlock.c diff --git a/tools/cmake/GCCFlags.cmake b/tools/cmake/GCCFlags.cmake index a6ec7a90b9..432441c9b7 100644 --- a/tools/cmake/GCCFlags.cmake +++ b/tools/cmake/GCCFlags.cmake @@ -192,6 +192,12 @@ if(enable_address_sanitizer) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -fsanitize=address") set(TESH_OPTION --enable-sanitizers) + try_compile(HAVE_SANITIZE_ADDRESS ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_asan.cpp) + try_compile(HAVE_SANITIZE_ADDRESS_FIBER_SUPPORT ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_asan.cpp + COMPILE_DEFINITIONS -DCHECK_FIBER_SUPPORT) +else() + set(HAVE_SANITIZE_ADDRESS FALSE CACHE INTERNAL "") + set(HAVE_SANITIZE_ADDRESS_FIBER_SUPPORT FALSE CACHE INTERNAL "") endif() if(enable_thread_sanitizer) diff --git a/tools/cmake/src/internal_config.h.in b/tools/cmake/src/internal_config.h.in index b98161a411..aac7ce0a3e 100644 --- a/tools/cmake/src/internal_config.h.in +++ b/tools/cmake/src/internal_config.h.in @@ -3,7 +3,7 @@ /* Warning: The file internal_config.h is AUTOMATICALLY GENERATED by Cmake. * Edit the template instead: tools/cmake/src/internal_config.h.in */ -/* Copyright (c) 2004-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -24,6 +24,10 @@ /* */ #cmakedefine01 HAVE_VALGRIND_H +/* Address Sanitizer */ +#cmakedefine01 HAVE_SANITIZE_ADDRESS +#cmakedefine01 HAVE_SANITIZE_ADDRESS_FIBER_SUPPORT + /* Time portability */ /* Function gettimeofday */ #cmakedefine01 HAVE_GETTIMEOFDAY diff --git a/tools/cmake/test_prog/prog_asan.cpp b/tools/cmake/test_prog/prog_asan.cpp new file mode 100644 index 0000000000..67d8adf8fe --- /dev/null +++ b/tools/cmake/test_prog/prog_asan.cpp @@ -0,0 +1,29 @@ +/* Copyright (c) 2017. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +/* Check availability of AddressSanitizer */ + +#if defined(__has_feature) +#define HAS_FEATURE(x) __has_feature(x) +#else +#define HAS_FEATURE(x) 0 +#endif + +#if not HAS_FEATURE(address_sanitizer) && not defined(__SANITIZE_ADDRESS__) +#error "ASan feature not found." +#endif + +#include + +#if defined(CHECK_FIBER_SUPPORT) +// Verify the existence of the fiber annotation interface, with the expected signature +void (*start_fiber)(void**, const void*, size_t) = __sanitizer_start_switch_fiber; +void (*finish_fiber)(void*, const void**, size_t*) = __sanitizer_finish_switch_fiber; +#endif + +int main(void) +{ +} -- 2.30.2