diff --git a/CMakeLists.txt b/CMakeLists.txt index 0af358ddff..e9eb8792c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,11 +247,25 @@ else() endif() if(${USING_ASAN} OR ${USING_ASAN_INT}) + + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + configure_file(asan_blacklist.in asan_blacklist) + add_compile_options( + "-fsanitize-blacklist=${CMAKE_BINARY_DIR}/asan_blacklist") + endif() + if(${USING_ASAN_INT}) - add_compile_options(-fsanitize=address,undefined,integer) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-fsanitize=address,undefined,integer) + else() + message( + WARNING "ASAN_INT is only supported with clang, defaulting to ASAN") + add_compile_options(-fsanitize=address,undefined) + endif() else() add_compile_options(-fsanitize=address,undefined) endif() + add_definitions(-DED25519_NO_INLINE_ASM) add_definitions(-DROCKSDB_UBSAN_RUN) elseif(${USING_TSAN}) @@ -325,8 +339,13 @@ else() endif() if(${USING_ASAN_INT}) - set(PLATFORM_LINK_FLAGS - "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined,integer") + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(PLATFORM_LINK_FLAGS + "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined,integer") + else() + set(PLATFORM_LINK_FLAGS + "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined") + endif() elseif(${USING_ASAN}) set(PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined") diff --git a/asan_blacklist b/asan_blacklist deleted file mode 100644 index 08933b31f1..0000000000 --- a/asan_blacklist +++ /dev/null @@ -1 +0,0 @@ -src:*ed25519* \ No newline at end of file diff --git a/asan_blacklist.in b/asan_blacklist.in new file mode 100644 index 0000000000..66aae5f511 --- /dev/null +++ b/asan_blacklist.in @@ -0,0 +1,5 @@ +src:${BOOST_ROOT}/* +src:${PROJECT_SOURCE_DIR}/crypto/* +src:${PROJECT_SOURCE_DIR}/diskhash/* +src:${PROJECT_SOURCE_DIR}/lmdb/* +src:${PROJECT_SOURCE_DIR}/rocksdb/* diff --git a/nano/lib/CMakeLists.txt b/nano/lib/CMakeLists.txt index f679c7b913..11fc77c2c8 100644 --- a/nano/lib/CMakeLists.txt +++ b/nano/lib/CMakeLists.txt @@ -19,6 +19,7 @@ endif() add_library( nano_lib ${platform_sources} + asan_warnings.hpp asio.hpp asio.cpp blockbuilders.hpp diff --git a/nano/lib/asan_warnings.hpp b/nano/lib/asan_warnings.hpp new file mode 100644 index 0000000000..1e9ae054b5 --- /dev/null +++ b/nano/lib/asan_warnings.hpp @@ -0,0 +1,13 @@ +#if defined(__clang__) +#if defined(__has_feature) +#if __has_feature(address_sanitizer) +#define ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW __attribute__ ((no_sanitize ("unsigned-integer-overflow"))) +#else +#define ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW +#endif +#else +#define ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW +#endif +#else +#define ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW +#endif diff --git a/nano/lib/numbers.hpp b/nano/lib/numbers.hpp index dc3c2b1d2f..111d40eb2d 100644 --- a/nano/lib/numbers.hpp +++ b/nano/lib/numbers.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include namespace nano @@ -274,6 +276,7 @@ namespace std template <> struct hash<::nano::uint256_union> { + ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW size_t operator() (::nano::uint256_union const & data_a) const { return data_a.qwords[0] + data_a.qwords[1] + data_a.qwords[2] + data_a.qwords[3]; diff --git a/nano/node/xorshift.hpp b/nano/node/xorshift.hpp index 2653802d31..843b132a38 100644 --- a/nano/node/xorshift.hpp +++ b/nano/node/xorshift.hpp @@ -1,4 +1,7 @@ #pragma once + +#include + #include namespace nano @@ -8,6 +11,8 @@ class xorshift1024star final public: std::array s; unsigned p{ 0 }; + + ATTRIBUTE_NO_SANITIZE_UINT_OVERFLOW uint64_t next () { auto p_l (p);