337 lines · plain
1# Testing rules for AddressSanitizer.2#3# These are broken into two buckets. One set of tests directly interacts with4# the runtime library and checks its functionality. These are the5# no-instrumentation tests.6#7# Another group of tests relies upon the ability to compile the test with8# address sanitizer instrumentation pass. These tests form "integration" tests9# and have some elements of version skew -- they test the *host* compiler's10# instrumentation against the just-built runtime library.11 12include(CheckCXXCompilerFlag)13include(CompilerRTCompile)14 15include_directories(..)16include_directories(../..)17 18set(ASAN_UNITTEST_HEADERS19 asan_mac_test.h20 asan_test_config.h21 asan_test_utils.h)22 23set(ASAN_UNITTEST_COMMON_CFLAGS24 ${COMPILER_RT_UNITTEST_CFLAGS}25 ${COMPILER_RT_GTEST_CFLAGS}26 ${SANITIZER_TEST_CXX_CFLAGS}27 -I${COMPILER_RT_SOURCE_DIR}/include28 -I${COMPILER_RT_SOURCE_DIR}/lib29 -I${COMPILER_RT_SOURCE_DIR}/lib/asan30 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests31 -DSANITIZER_COMMON_NO_REDEFINE_BUILTINS32 -fno-rtti33 -O234 -Wno-format35 -Werror=sign-compare)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 used39# during cross compilation40set(ASAN_UNITTEST_COMMON_LINK_FLAGS41 ${COMPILER_RT_UNITTEST_LINK_FLAGS}42 ${COMPILER_RT_UNWINDER_LINK_LIBS}43 ${SANITIZER_TEST_CXX_LIBRARIES})44 45# -gline-tables-only must be enough for ASan, so use it if possible.46if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")47 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)48else()49 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)50endif()51if(MSVC)52 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview)53endif()54list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g)55 56# Use -D instead of definitions to please custom compile command.57list(APPEND ASAN_UNITTEST_COMMON_CFLAGS58 -DASAN_HAS_IGNORELIST=159 -DASAN_HAS_EXCEPTIONS=160 -DASAN_UAR=061 )62 63if(APPLE)64 list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS})65 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS})66 67 add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS)68 add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)69 add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)70 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS})71endif()72 73set(ASAN_IGNORELIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore")74set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS75 ${ASAN_UNITTEST_COMMON_CFLAGS}76 -fsanitize=address77 "-fsanitize-ignorelist=${ASAN_IGNORELIST_FILE}"78)79if(NOT MSVC)80 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS --driver-mode=g++)81endif()82 83# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests.84if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")85 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS "-lc++")86endif()87 88# Unit tests on Mac depend on Foundation.89if(APPLE)90 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -framework Foundation)91endif()92if(ANDROID)93 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -pie)94endif()95 96set(ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS97 ${ASAN_UNITTEST_COMMON_LINK_FLAGS})98list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS -fsanitize=address)99 100set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS101 ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}102 -shared-libasan)103 104set(ASAN_UNITTEST_INSTRUMENTED_LIBS)105 106set(ASAN_UNITTEST_NOINST_LINK_FLAGS ${ASAN_UNITTEST_COMMON_LINK_FLAGS})107append_list_if(MSVC -Wl,-nodefaultlib:msvcrt ASAN_UNITTEST_NOINST_LINK_FLAGS)108if(NOT APPLE)109 append_list_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINK_FLAGS)110 append_list_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINK_FLAGS)111 append_list_if(COMPILER_RT_HAS_LIBRT -lrt ASAN_UNITTEST_NOINST_LINK_FLAGS)112 append_list_if(HAIKU -lbsd ASAN_UNITTEST_NOINST_LINK_FLAGS)113 append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINK_FLAGS)114 append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS)115endif()116 117# TODO(eugenis): move all -l flags above to _LIBS?118set(ASAN_UNITTEST_NOINST_LIBS)119append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_UNITTEST_NOINST_LIBS)120 121# Main AddressSanitizer unit tests.122add_custom_target(AsanUnitTests)123set_target_properties(AsanUnitTests PROPERTIES FOLDER "Compiler-RT/Tests")124 125# AddressSanitizer unit tests with dynamic runtime (on platforms where it's126# not the default).127add_custom_target(AsanDynamicUnitTests)128set_target_properties(AsanDynamicUnitTests PROPERTIES FOLDER "Compiler-RT/Tests")129# ASan benchmarks (not actively used now).130add_custom_target(AsanBenchmarks)131set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Compiler-RT/Tests")132 133set(ASAN_NOINST_TEST_SOURCES134 ${COMPILER_RT_GTEST_SOURCE}135 asan_fake_stack_test.cpp136 asan_noinst_test.cpp137 asan_test_main.cpp138 )139 140set(ASAN_INST_TEST_SOURCES141 ${COMPILER_RT_GTEST_SOURCE}142 asan_globals_test.cpp143 asan_interface_test.cpp144 asan_internal_interface_test.cpp145 asan_test.cpp146 asan_oob_test.cpp147 asan_mem_test.cpp148 asan_str_test.cpp149 asan_test_main.cpp150 )151if(APPLE)152 list(APPEND ASAN_INST_TEST_SOURCES153 asan_mac_test.cpp154 asan_mac_test_helpers.mm155 )156endif()157 158set(ASAN_BENCHMARKS_SOURCES159 ${COMPILER_RT_GTEST_SOURCE}160 asan_benchmarks_test.cpp161 )162 163function(add_asan_tests arch test_runtime)164 cmake_parse_arguments(TEST "" "KIND" "CFLAGS" ${ARGN})165 166 # The Lit files are configured once per architecture and static/dynamic167 # selection. Each configuration expects the test binaries in a corresponding168 # subdirectory. Generate subdirectory names based on the architecture name.169 string(TOUPPER ${arch} ARCH_UPPER_CASE)170 set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config)171 set(CONFIG_NAME_DYNAMIC ${ARCH_UPPER_CASE}${OS_NAME}DynamicConfig)172 173 # On some platforms, unit tests can be run against the runtime that shipped174 # with the host compiler with COMPILER_RT_TEST_STANDALONE_BUILD_LIBS=OFF.175 # COMPILER_RT_ASAN_UNIT_TESTS_USE_HOST_RUNTIME=ON removes the dependency176 # on `asan`, allowing the tests to be run independently without177 # a newly built asan runtime.178 set(ASAN_UNIT_TEST_DEPS asan)179 if(COMPILER_RT_ASAN_UNIT_TESTS_USE_HOST_RUNTIME)180 set(ASAN_UNIT_TEST_DEPS)181 endif()182 183 # Closure to keep the values.184 function(generate_asan_tests test_objects test_suite testname)185 generate_compiler_rt_tests(${test_objects} ${test_suite} ${testname} ${arch}186 COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_IGNORELIST_FILE}187 DEPS ${ASAN_UNIT_TEST_DEPS}188 KIND ${TEST_KIND}189 ${ARGN}190 )191 set("${test_objects}" "${${test_objects}}" PARENT_SCOPE)192 endfunction()193 194 set(TARGET_LINK_FLAGS)195 get_target_link_flags_for_arch(${arch} TARGET_LINK_FLAGS)196 197 set(ASAN_INST_TEST_OBJECTS)198 generate_asan_tests(ASAN_INST_TEST_OBJECTS AsanUnitTests199 "Asan-${arch}${TEST_KIND}-Test"200 SUBDIR "${CONFIG_NAME}"201 LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS}202 SOURCES ${ASAN_INST_TEST_SOURCES}203 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${TEST_CFLAGS})204 205 if(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME)206 set(dynamic_test_name "Asan-${arch}${TEST_KIND}-Dynamic-Test")207 if(MSVC)208 209 # With the MSVC CRT, the choice between static and dynamic CRT is made at210 # compile time with a macro. Simulate the effect of passing /MD to clang-cl.211 set(ASAN_DYNAMIC_TEST_OBJECTS)212 generate_asan_tests(ASAN_DYNAMIC_TEST_OBJECTS213 AsanDynamicUnitTests "${dynamic_test_name}"214 SUBDIR "${CONFIG_NAME_DYNAMIC}"215 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -D_MT -D_DLL216 SOURCES ${ASAN_INST_TEST_SOURCES}217 LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS}218 -D_MT -D_DLL -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames219 )220 else()221 set(DYNAMIC_LINK_FLAGS)222 get_dynamic_link_flags_for_arch(${arch} DYNAMIC_LINK_FLAGS)223 224 # Otherwise, reuse ASAN_INST_TEST_OBJECTS.225 add_compiler_rt_test(AsanDynamicUnitTests "${dynamic_test_name}" "${arch}"226 SUBDIR "${CONFIG_NAME_DYNAMIC}"227 OBJECTS ${ASAN_INST_TEST_OBJECTS}228 DEPS ${ASAN_UNIT_TEST_DEPS} ${ASAN_INST_TEST_OBJECTS}229 LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS} ${DYNAMIC_LINK_FLAGS}230 )231 endif()232 endif()233 234 # Uninstrumented tests.235 set(ASAN_NOINST_TEST_OBJECTS)236 generate_asan_tests(ASAN_NOINST_TEST_OBJECTS237 AsanUnitTests "Asan-${arch}${TEST_KIND}-Noinst-Test"238 SUBDIR "${CONFIG_NAME}"239 CFLAGS ${ASAN_UNITTEST_COMMON_CFLAGS}240 LINK_FLAGS ${ASAN_UNITTEST_NOINST_LINK_FLAGS} ${TARGET_LINK_FLAGS}241 SOURCES ${ASAN_NOINST_TEST_SOURCES}242 RUNTIME ${test_runtime})243 244 set(ASAN_BENCHMARK_OBJECTS)245 generate_asan_tests(ASAN_BENCHMARK_OBJECTS246 AsanBenchmarks "Asan-${arch}${TEST_KIND}-Benchmark"247 SUBDIR "${CONFIG_NAME}"248 CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}249 SOURCES ${ASAN_BENCHMARKS_SOURCES}250 LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS})251endfunction()252 253if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID)254 set(ASAN_TEST_ARCH ${ASAN_SUPPORTED_ARCH})255 if(APPLE)256 darwin_filter_host_archs(ASAN_SUPPORTED_ARCH ASAN_TEST_ARCH)257 endif()258 list(REMOVE_ITEM ASAN_TEST_ARCH sparcv9)259 if(OS_NAME MATCHES "SunOS")260 list(REMOVE_ITEM ASAN_TEST_ARCH x86_64)261 endif()262 263 foreach(arch ${ASAN_TEST_ARCH})264 265 # Add static ASan runtime that will be linked with uninstrumented tests.266 set(ASAN_TEST_RUNTIME RTAsanTest.${arch})267 if(APPLE)268 set(ASAN_TEST_RUNTIME_OBJECTS269 $<TARGET_OBJECTS:RTAsan_dynamic.osx>270 $<TARGET_OBJECTS:RTInterception.osx>271 $<TARGET_OBJECTS:RTSanitizerCommon.osx>272 $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>273 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.osx>274 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.osx>275 $<TARGET_OBJECTS:RTLSanCommon.osx>276 $<TARGET_OBJECTS:RTUbsan.osx>)277 else()278 set(ASAN_TEST_RUNTIME_OBJECTS279 $<TARGET_OBJECTS:RTAsan.${arch}>280 $<TARGET_OBJECTS:RTAsan_cxx.${arch}>281 $<TARGET_OBJECTS:RTAsan_static.${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:RTSanitizerCommonSymbolizerInternal.${arch}>288 $<TARGET_OBJECTS:RTLSanCommon.${arch}>289 $<TARGET_OBJECTS:RTUbsan.${arch}>)290 endif()291 add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS})292 set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES293 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}294 FOLDER "Compiler-RT/Tests/Runtime")295 296 add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-inline")297 add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-calls"298 CFLAGS -mllvm -asan-instrumentation-with-call-threshold=0)299 endforeach()300endif()301 302if(ANDROID)303 foreach(arch ${ASAN_SUPPORTED_ARCH})304 # Test w/o ASan instrumentation. Link it with ASan statically.305 add_executable(AsanNoinstTest # FIXME: .arch?306 $<TARGET_OBJECTS:RTAsan.${arch}>307 $<TARGET_OBJECTS:RTAsan_static.${arch}>308 $<TARGET_OBJECTS:RTInterception.${arch}>309 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>310 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>311 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>312 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>313 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}>314 $<TARGET_OBJECTS:RTLSanCommon.${arch}>315 $<TARGET_OBJECTS:RTUbsan.${arch}>316 ${COMPILER_RT_GTEST_SOURCE}317 ${ASAN_NOINST_TEST_SOURCES})318 set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS})319 set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINK_FLAGS})320 target_link_libraries(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LIBS})321 322 # Test with ASan instrumentation. Link with ASan dynamic runtime.323 add_executable(AsanTest324 ${COMPILER_RT_GTEST_SOURCE}325 ${ASAN_INST_TEST_SOURCES})326 set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS})327 set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS})328 target_link_libraries(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LIBS})329 330 # Setup correct output directory and link flags.331 set_target_properties(AsanNoinstTest AsanTest PROPERTIES332 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})333 # Add unit tests to the test suite.334 add_dependencies(AsanUnitTests AsanNoinstTest AsanTest)335 endforeach()336endif()337