Home | History | Annotate | Line # | Download | only in tests
      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 
     12 include(CheckCXXCompilerFlag)
     13 include(CompilerRTCompile)
     14 
     15 include_directories(..)
     16 include_directories(../..)
     17 
     18 set(ASAN_UNITTEST_HEADERS
     19   asan_mac_test.h
     20   asan_test_config.h
     21   asan_test_utils.h)
     22 
     23 set(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)
     36 append_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
     40 set(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.
     44 if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
     45   list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)
     46 else()
     47   list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)
     48 endif()
     49 if(MSVC)
     50   list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview)
     51 endif()
     52 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g)
     53 
     54 # Use -D instead of definitions to please custom compile command.
     55 list(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 
     61 if(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})
     69 endif()
     70 
     71 set(ASAN_BLACKLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore")
     72 set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS
     73   ${ASAN_UNITTEST_COMMON_CFLAGS}
     74   -fsanitize=address
     75   "-fsanitize-blacklist=${ASAN_BLACKLIST_FILE}"
     76 )
     77 if(CAN_TARGET_x86_64 OR CAN_TARGET_i386)
     78   list(APPEND ASAN_UNITTEST_INSTRUMENTED_CFLAGS -mllvm -asan-instrument-assembly)
     79 endif()
     80 
     81 if(NOT MSVC)
     82   list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS --driver-mode=g++)
     83 endif()
     84 
     85 # x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests.
     86 if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")
     87   list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS "-lc++")
     88 endif()
     89 
     90 # Unit tests on Mac depend on Foundation.
     91 if(APPLE)
     92   list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -framework Foundation)
     93 endif()
     94 if(ANDROID)
     95   list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -pie)
     96 endif()
     97 
     98 set(ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS
     99   ${ASAN_UNITTEST_COMMON_LINK_FLAGS})
    100 list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS -fsanitize=address)
    101 
    102 set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS
    103   ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}
    104   -shared-libasan)
    105 
    106 set(ASAN_UNITTEST_INSTRUMENTED_LIBS)
    107 # NDK r10 requires -latomic almost always.
    108 append_list_if(ANDROID atomic ASAN_UNITTEST_INSTRUMENTED_LIBS)
    109 
    110 set(ASAN_UNITTEST_NOINST_LINK_FLAGS ${ASAN_UNITTEST_COMMON_LINK_FLAGS})
    111 if(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)
    117 endif()
    118 
    119 # TODO(eugenis): move all -l flags above to _LIBS?
    120 set(ASAN_UNITTEST_NOINST_LIBS)
    121 append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_UNITTEST_NOINST_LIBS)
    122 # NDK r10 requires -latomic almost always.
    123 append_list_if(ANDROID atomic ASAN_UNITTEST_NOINST_LIBS)
    124 
    125 # Main AddressSanitizer unit tests.
    126 add_custom_target(AsanUnitTests)
    127 set_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).
    131 add_custom_target(AsanDynamicUnitTests)
    132 set_target_properties(AsanDynamicUnitTests PROPERTIES FOLDER "Compiler-RT Tests")
    133 # ASan benchmarks (not actively used now).
    134 add_custom_target(AsanBenchmarks)
    135 set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Compiler-RT Tests")
    136 
    137 set(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 
    143 set(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)
    154 if(APPLE)
    155   list(APPEND ASAN_INST_TEST_SOURCES asan_mac_test.cc asan_mac_test_helpers.mm)
    156 endif()
    157 
    158 set(ASAN_BENCHMARKS_SOURCES
    159   ${COMPILER_RT_GTEST_SOURCE}
    160   asan_benchmarks_test.cc)
    161 
    162 function(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})
    228 endfunction()
    229 
    230 if(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()
    275 endif()
    276 
    277 if(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()
    309 endif()
    310