1# Testing rules for AddressSanitizer. 2# 3# These are broken into two buckets. One set of tests directly interacts with 4# the runtime library and checks its functionality. These are the 5# no-instrumentation tests. 6# 7# Another group of tests relies upon the ability to compile the test with 8# address sanitizer instrumentation pass. These tests form "integration" tests 9# and have some elements of version skew -- they test the *host* compiler's 10# instrumentation against the just-built runtime library. 11 12include(CheckCXXCompilerFlag) 13include(CompilerRTCompile) 14 15include_directories(..) 16include_directories(../..) 17 18set(ASAN_UNITTEST_HEADERS 19 asan_mac_test.h 20 asan_test_config.h 21 asan_test_utils.h) 22 23set(ASAN_UNITTEST_COMMON_CFLAGS 24 ${COMPILER_RT_UNITTEST_CFLAGS} 25 ${COMPILER_RT_GTEST_CFLAGS} 26 ${COMPILER_RT_ASAN_SHADOW_SCALE_LLVM_FLAG} 27 -I${COMPILER_RT_SOURCE_DIR}/include 28 -I${COMPILER_RT_SOURCE_DIR}/lib 29 -I${COMPILER_RT_SOURCE_DIR}/lib/asan 30 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests 31 -fno-rtti 32 -O2 33 -Wno-format 34 -Werror=sign-compare 35 -Wno-non-virtual-dtor) 36append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS) 37 38# This will ensure the target linker is used 39# during cross compilation 40set(ASAN_UNITTEST_COMMON_LINK_FLAGS 41 ${COMPILER_RT_UNITTEST_LINK_FLAGS}) 42 43# -gline-tables-only must be enough for ASan, so use it if possible. 44if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") 45 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only) 46else() 47 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g) 48endif() 49if(MSVC) 50 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview) 51endif() 52list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g) 53 54# Use -D instead of definitions to please custom compile command. 55list(APPEND ASAN_UNITTEST_COMMON_CFLAGS 56 ${COMPILER_RT_ASAN_SHADOW_SCALE_FLAG} 57 -DASAN_HAS_BLACKLIST=1 58 -DASAN_HAS_EXCEPTIONS=1 59 -DASAN_UAR=0) 60 61if(APPLE) 62 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS}) 63 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS}) 64 65 add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS) 66 add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS) 67 add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) 68 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}) 69endif() 70 71set(ASAN_BLACKLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore") 72set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS 73 ${ASAN_UNITTEST_COMMON_CFLAGS} 74 -fsanitize=address 75 "-fsanitize-blacklist=${ASAN_BLACKLIST_FILE}" 76) 77if(CAN_TARGET_x86_64 OR CAN_TARGET_i386) 78 list(APPEND ASAN_UNITTEST_INSTRUMENTED_CFLAGS -mllvm -asan-instrument-assembly) 79endif() 80 81if(NOT MSVC) 82 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS --driver-mode=g++) 83endif() 84 85# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. 86if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") 87 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS "-lc++") 88endif() 89 90# Unit tests on Mac depend on Foundation. 91if(APPLE) 92 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -framework Foundation) 93endif() 94if(ANDROID) 95 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -pie) 96endif() 97 98set(ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS 99 ${ASAN_UNITTEST_COMMON_LINK_FLAGS}) 100list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS -fsanitize=address) 101 102set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS 103 ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} 104 -shared-libasan) 105 106set(ASAN_UNITTEST_INSTRUMENTED_LIBS) 107# NDK r10 requires -latomic almost always. 108append_list_if(ANDROID atomic ASAN_UNITTEST_INSTRUMENTED_LIBS) 109 110set(ASAN_UNITTEST_NOINST_LINK_FLAGS ${ASAN_UNITTEST_COMMON_LINK_FLAGS}) 111if(NOT APPLE) 112 append_list_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINK_FLAGS) 113 append_list_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINK_FLAGS) 114 append_list_if(COMPILER_RT_HAS_LIBRT -lrt ASAN_UNITTEST_NOINST_LINK_FLAGS) 115 append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINK_FLAGS) 116 append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS) 117endif() 118 119# TODO(eugenis): move all -l flags above to _LIBS? 120set(ASAN_UNITTEST_NOINST_LIBS) 121append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_UNITTEST_NOINST_LIBS) 122# NDK r10 requires -latomic almost always. 123append_list_if(ANDROID atomic ASAN_UNITTEST_NOINST_LIBS) 124 125# Main AddressSanitizer unit tests. 126add_custom_target(AsanUnitTests) 127set_target_properties(AsanUnitTests PROPERTIES FOLDER "Compiler-RT Tests") 128 129# AddressSanitizer unit tests with dynamic runtime (on platforms where it's 130# not the default). 131add_custom_target(AsanDynamicUnitTests) 132set_target_properties(AsanDynamicUnitTests PROPERTIES FOLDER "Compiler-RT Tests") 133# ASan benchmarks (not actively used now). 134add_custom_target(AsanBenchmarks) 135set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Compiler-RT Tests") 136 137set(ASAN_NOINST_TEST_SOURCES 138 ${COMPILER_RT_GTEST_SOURCE} 139 asan_fake_stack_test.cc 140 asan_noinst_test.cc 141 asan_test_main.cc) 142 143set(ASAN_INST_TEST_SOURCES 144 ${COMPILER_RT_GTEST_SOURCE} 145 asan_asm_test.cc 146 asan_globals_test.cc 147 asan_interface_test.cc 148 asan_internal_interface_test.cc 149 asan_test.cc 150 asan_oob_test.cc 151 asan_mem_test.cc 152 asan_str_test.cc 153 asan_test_main.cc) 154if(APPLE) 155 list(APPEND ASAN_INST_TEST_SOURCES asan_mac_test.cc asan_mac_test_helpers.mm) 156endif() 157 158set(ASAN_BENCHMARKS_SOURCES 159 ${COMPILER_RT_GTEST_SOURCE} 160 asan_benchmarks_test.cc) 161 162function(add_asan_tests arch test_runtime) 163 cmake_parse_arguments(TEST "" "KIND" "CFLAGS" ${ARGN}) 164 165 # Closure to keep the values. 166 function(generate_asan_tests test_objects test_suite testname) 167 generate_compiler_rt_tests(${test_objects} ${test_suite} ${testname} ${arch} 168 COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_BLACKLIST_FILE} 169 DEPS gtest asan 170 KIND ${TEST_KIND} 171 ${ARGN} 172 ) 173 set("${test_objects}" "${${test_objects}}" PARENT_SCOPE) 174 endfunction() 175 176 set(ASAN_INST_TEST_OBJECTS) 177 generate_asan_tests(ASAN_INST_TEST_OBJECTS AsanUnitTests 178 "Asan-${arch}${TEST_KIND}-Test" 179 SUBDIR "default" 180 LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} 181 SOURCES ${ASAN_INST_TEST_SOURCES} 182 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${TEST_CFLAGS}) 183 184 if(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME) 185 set(dynamic_test_name "Asan-${arch}${TEST_KIND}-Dynamic-Test") 186 if(MSVC) 187 188 # With the MSVC CRT, the choice between static and dynamic CRT is made at 189 # compile time with a macro. Simulate the effect of passing /MD to clang-cl. 190 set(ASAN_DYNAMIC_TEST_OBJECTS) 191 generate_asan_tests(ASAN_DYNAMIC_TEST_OBJECTS 192 AsanDynamicUnitTests "${dynamic_test_name}" 193 SUBDIR "dynamic" 194 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -D_MT -D_DLL 195 SOURCES ${ASAN_INST_TEST_SOURCES} 196 LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS} 197 -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames 198 ) 199 else() 200 201 # Otherwise, reuse ASAN_INST_TEST_OBJECTS. 202 add_compiler_rt_test(AsanDynamicUnitTests "${dynamic_test_name}" "${arch}" 203 SUBDIR "dynamic" 204 OBJECTS ${ASAN_INST_TEST_OBJECTS} 205 DEPS asan ${ASAN_INST_TEST_OBJECTS} 206 LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS} 207 ) 208 endif() 209 endif() 210 211 # Uninstrumented tests. 212 set(ASAN_NOINST_TEST_OBJECTS) 213 generate_asan_tests(ASAN_NOINST_TEST_OBJECTS 214 AsanUnitTests "Asan-${arch}${TEST_KIND}-Noinst-Test" 215 SUBDIR "default" 216 CFLAGS ${ASAN_UNITTEST_COMMON_CFLAGS} 217 LINK_FLAGS ${ASAN_UNITTEST_NOINST_LINK_FLAGS} 218 SOURCES ${ASAN_NOINST_TEST_SOURCES} 219 RUNTIME ${test_runtime}) 220 221 set(ASAN_BENCHMARK_OBJECTS) 222 generate_asan_tests(ASAN_BENCHMARK_OBJECTS 223 AsanBenchmarks "Asan-${arch}${TEST_KIND}-Benchmark" 224 SUBDIR "default" 225 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} 226 SOURCES ${ASAN_BENCHMARKS_SOURCES} 227 LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}) 228endfunction() 229 230if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) 231 set(ASAN_TEST_ARCH ${ASAN_SUPPORTED_ARCH}) 232 if(APPLE) 233 darwin_filter_host_archs(ASAN_SUPPORTED_ARCH ASAN_TEST_ARCH) 234 endif() 235 if(OS_NAME MATCHES "SunOS") 236 list(REMOVE_ITEM ASAN_TEST_ARCH x86_64) 237 endif() 238 239 foreach(arch ${ASAN_TEST_ARCH}) 240 241 # Add static ASan runtime that will be linked with uninstrumented tests. 242 set(ASAN_TEST_RUNTIME RTAsanTest.${arch}) 243 if(APPLE) 244 set(ASAN_TEST_RUNTIME_OBJECTS 245 $<TARGET_OBJECTS:RTAsan_dynamic.osx> 246 $<TARGET_OBJECTS:RTInterception.osx> 247 $<TARGET_OBJECTS:RTSanitizerCommon.osx> 248 $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx> 249 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.osx> 250 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.osx> 251 $<TARGET_OBJECTS:RTLSanCommon.osx> 252 $<TARGET_OBJECTS:RTUbsan.osx>) 253 else() 254 set(ASAN_TEST_RUNTIME_OBJECTS 255 $<TARGET_OBJECTS:RTAsan.${arch}> 256 $<TARGET_OBJECTS:RTAsan_cxx.${arch}> 257 $<TARGET_OBJECTS:RTInterception.${arch}> 258 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> 259 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}> 260 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}> 261 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}> 262 $<TARGET_OBJECTS:RTLSanCommon.${arch}> 263 $<TARGET_OBJECTS:RTUbsan.${arch}> 264 $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>) 265 endif() 266 add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS}) 267 set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES 268 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 269 FOLDER "Compiler-RT Runtime tests") 270 271 add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-inline") 272 add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-calls" 273 CFLAGS -mllvm -asan-instrumentation-with-call-threshold=0) 274 endforeach() 275endif() 276 277if(ANDROID) 278 foreach(arch ${ASAN_SUPPORTED_ARCH}) 279 # Test w/o ASan instrumentation. Link it with ASan statically. 280 add_executable(AsanNoinstTest # FIXME: .arch? 281 $<TARGET_OBJECTS:RTAsan.${arch}> 282 $<TARGET_OBJECTS:RTInterception.${arch}> 283 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> 284 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}> 285 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}> 286 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}> 287 $<TARGET_OBJECTS:RTUbsan.${arch}> 288 $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> 289 ${COMPILER_RT_GTEST_SOURCE} 290 ${ASAN_NOINST_TEST_SOURCES}) 291 set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS}) 292 set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINK_FLAGS}) 293 target_link_libraries(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LIBS}) 294 295 # Test with ASan instrumentation. Link with ASan dynamic runtime. 296 add_executable(AsanTest 297 ${COMPILER_RT_GTEST_SOURCE} 298 ${ASAN_INST_TEST_SOURCES}) 299 set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}) 300 set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}) 301 target_link_libraries(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LIBS}) 302 303 # Setup correct output directory and link flags. 304 set_target_properties(AsanNoinstTest AsanTest PROPERTIES 305 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 306 # Add unit tests to the test suite. 307 add_dependencies(AsanUnitTests AsanNoinstTest AsanTest) 308 endforeach() 309endif() 310