Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Check if ASan is enabled from CMake, and define variables.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 28 Sep 2017 13:53:22 +0000 (15:53 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 28 Sep 2017 15:08:38 +0000 (17:08 +0200)
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
src/smpi/internals/smpi_memory.cpp
tools/cmake/DefinePackages.cmake
tools/cmake/GCCFlags.cmake
tools/cmake/src/internal_config.h.in
tools/cmake/test_prog/prog_asan.cpp [new file with mode: 0644]

index 342de40..e2bb276 100644 (file)
@@ -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)
index 67de25e..fcc5cc2 100644 (file)
@@ -21,6 +21,7 @@
 #include <sys/mman.h>
 #include <unistd.h>
 
+#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 <sanitizer/asan_interface.h>
-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<char*>(src);
   char* pdest = static_cast<char*>(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;
index 7280d5d..247836a 100644 (file)
@@ -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
index a6ec7a9..432441c 100644 (file)
@@ -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)
index b98161a..aac7ce0 100644 (file)
@@ -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. */
 /* <valgrind/valgrind.h> */
 #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 (file)
index 0000000..67d8adf
--- /dev/null
@@ -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 <sanitizer/asan_interface.h>
+
+#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)
+{
+}