Skip to content

Commit 2234fa4

Browse files
committed
Add Asan build type that enables the Address and UB sanitizers.
Uses generator statements instead of CMAKE_<TYPE>_FLAGS_ASAN to support multiconfig generators like Xcode.
1 parent 5e06c8d commit 2234fa4

File tree

5 files changed

+48
-27
lines changed

5 files changed

+48
-27
lines changed

CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,23 @@ if (MINGW)
610610
set( CMAKE_CXX_FLAGS "-DWINVER=0x0500 -D_EMULATE_GLIBC=0 ${CMAKE_CXX_FLAGS}") # Workaround for bug in gtest on mingw, see https://github.com/google/googletest/issues/893 and https://github.com/google/googletest/issues/920
611611
endif()
612612

613+
if (APPLE)
614+
execute_process(COMMAND clang --print-file-name=libclang_rt.asan_osx_dynamic.dylib
615+
OUTPUT_VARIABLE ASAN_DYNAMIC_LIB
616+
OUTPUT_STRIP_TRAILING_WHITESPACE)
617+
set(ASAN_DYNAMIC_LIB_ENV "DYLD_INSERT_LIBRARIES=${ASAN_DYNAMIC_LIB}")
618+
elseif(UNIX)
619+
execute_process(COMMAND gcc -print-file-name=libasan.so OUTPUT_VARIABLE LIBASAN_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
620+
execute_process(COMMAND gcc -print-file-name=libstdc++.so OUTPUT_VARIABLE LIBSTDCXX_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
621+
set(PRELOADS "${LIBASAN_PATH} ${LIBSTDCXX_PATH}")
622+
set(ASAN_OPTIONS "detect_leaks=0:fast_unwind_on_malloc=0")
623+
set(ASAN_DYNAMIC_LIB_ENV "LD_PRELOAD=${PRELOADS};ASAN_OPTIONS=${ASAN_OPTIONS}")
624+
endif ()
625+
set(ASAN_BUILD_OPTIONS -fsanitize=address -fsanitize=undefined)
626+
set(ASAN_COMPILE_OPTIONS -g ${ASAN_BUILD_OPTIONS})
627+
add_compile_options("$<$<CONFIG:Asan>:${ASAN_COMPILE_OPTIONS}>")
628+
add_link_options("$<$<CONFIG:Asan>:${ASAN_BUILD_OPTIONS}>")
629+
613630
if (APPLE AND WITH_GNUCASH)
614631
set(CMAKE_MACOSX_RPATH ON)
615632
set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}")

bindings/python/tests/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ if (WITH_PYTHON)
77
endif()
88
add_custom_target(test-python-bindings ALL DEPENDS unittest_support gnucash-core-c-build gnucash-core-c-py sw-core-utils-build sw-core-utils-py sw-app-utils-build sw-app-utils-py)
99
add_dependencies(check test-python-bindings)
10-
add_test(python-bindings ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/runTests.py.in)
11-
set_property(TEST python-bindings PROPERTY ENVIRONMENT
12-
GNC_BUILDDIR=${CMAKE_BINARY_DIR}
13-
PYTHONPATH=${PYTHON_SYSCONFIG_BUILD}:${LIBDIR_BUILD}/gnucash:${test_core_dir}
14-
)
10+
add_test(NAME python-bindings COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/runTests.py.in)
11+
set(PYTHON_ENV "GNC_UNINSTALLED=1;GNC_BUILDDIR=${CMAKE_BINARY_DIR};PYTHONPATH=${PYTHON_SYSCONFIG_BUILD}:${LIBDIR_BUILD}/gnucash:${test_core_dir}")
12+
set(ASAN_ENV "${ASAN_DYNAMIC_LIB_ENV};ASAN_OPTIONS=fast_unwind_on_malloc=0")
13+
set_tests_properties(python-bindings PROPERTIES ENVIRONMENT "$<IF:$<CONFIG:Asan>,${PYTHON_ENV};${ASAN_ENV},${PYTHON_ENV}>")
14+
1515
endif()
1616

1717
set(test_python_bindings_DATA

common/cmake_modules/GncAddSchemeTargets.cmake

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,18 +266,23 @@ function(gnc_add_scheme_targets _TARGET)
266266
message(" GNC_MODULE_PATH: ${_GNC_MODULE_PATH}")
267267
endif()
268268
#We quote the arguments to stop CMake stripping the path separators.
269+
set (GUILE_ENV
270+
"${LIBRARY_PATH}"
271+
"GNC_UNINSTALLED=YES"
272+
"GNC_BUILDDIR=${CMAKE_BINARY_DIR}"
273+
"GUILE_LOAD_PATH=${_GUILE_LOAD_PATH}"
274+
"GUILE_LOAD_COMPILED_PATH=${_GUILE_LOAD_COMPILED_PATH}"
275+
"GNC_MODULE_PATH=${_GNC_MODULE_PATH}"
276+
)
277+
269278
add_custom_command(
270279
OUTPUT ${output_file}
271280
COMMAND ${CMAKE_COMMAND} -E env
272-
"${LIBRARY_PATH}"
273-
"GNC_UNINSTALLED=YES"
274-
"GNC_BUILDDIR=${CMAKE_BINARY_DIR}"
275-
"GUILE_LOAD_PATH=${_GUILE_LOAD_PATH}"
276-
"GUILE_LOAD_COMPILED_PATH=${_GUILE_LOAD_COMPILED_PATH}"
277-
"GNC_MODULE_PATH=${_GNC_MODULE_PATH}"
281+
"${GUILE_ENV}$<$<CONFIG:Asan>:;${ASAN_DYNAMIC_LIB_ENV}>"
278282
${GUILE_EXECUTABLE} -e "\(@@ \(guild\) main\)" -s ${GUILD_EXECUTABLE} compile -o ${output_file} ${source_file_abs_path}
279283
DEPENDS ${guile_depends}
280284
MAIN_DEPENDENCY ${source_file_abs_path}
285+
COMMAND_EXPAND_LISTS
281286
VERBATIM
282287
)
283288
endforeach(source_file)

common/cmake_modules/GncAddTest.cmake

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,36 +77,35 @@ function(gnc_add_test _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_
7777
# Extra arguments are treated as environment variables
7878
set(HAVE_ENV_VARS TRUE)
7979
endif()
80+
set(ENVVARS "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
81+
if (HAVE_ENV_VARS)
82+
list(APPEND ENVVARS ${ARGN})
83+
endif()
8084
set(TEST_INCLUDE_DIRS ${${TEST_INCLUDE_VAR_NAME}})
8185
set(TEST_LIBS ${${TEST_LIBS_VAR_NAME}})
8286
set_source_files_properties (${_SOURCE_FILES} PROPERTIES OBJECT_DEPENDS ${CONFIG_H})
83-
add_executable(${_TARGET} EXCLUDE_FROM_ALL ${_SOURCE_FILES})
84-
target_link_libraries(${_TARGET} ${TEST_LIBS})
85-
target_include_directories(${_TARGET} PRIVATE ${TEST_INCLUDE_DIRS})
86-
if (${HAVE_ENV_VARS})
87-
add_test(${_TARGET} ${CMAKE_BINARY_DIR}/bin/${_TARGET})
88-
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR};${ARGN}")
87+
if (CMAKE_GENERATOR STREQUAL Xcode)
88+
add_test(NAME ${_TARGET} COMMAND ${_TARGET} CONFIGURATIONS Debug;Release)
8989
else()
90-
if (CMAKE_GENERATOR STREQUAL Xcode)
91-
add_test(NAME ${_TARGET} COMMAND ${_TARGET} CONFIGURATIONS Debug;Release)
92-
else()
93-
add_test(NAME ${_TARGET} COMMAND ${_TARGET})
94-
endif()
95-
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
90+
add_test(NAME ${_TARGET} COMMAND ${_TARGET})
9691
endif()
92+
add_executable(${_TARGET} EXCLUDE_FROM_ALL ${_SOURCE_FILES})
93+
target_link_libraries(${_TARGET} PRIVATE ${TEST_LIBS})
94+
target_include_directories(${_TARGET} PRIVATE ${TEST_INCLUDE_DIRS})
95+
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "$<IF:$<CONFIG:Asan>,${ENVVARS};ASAN_OPTIONS=fast_unwind_on_malloc=0,${ENVVARS}>")
9796
add_dependencies(check ${_TARGET})
9897
endfunction()
9998

10099
function(gnc_add_test_with_guile _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_NAME)
101100
get_guile_env()
102101
gnc_add_test(${_TARGET} "${_SOURCE_FILES}" "${TEST_INCLUDE_VAR_NAME}" "${TEST_LIBS_VAR_NAME}"
103-
"${GUILE_ENV};${ARGN}"
102+
"${GUILE_ENV}$<$<CONFIG:Asan>:;${ASAN_DYNAMIC_LIB_ENV}>;${ARGN}"
104103
)
105104
endfunction()
106105

107106

108107
function(gnc_add_scheme_test _TARGET _SOURCE_FILE)
109-
add_test(${_TARGET} ${GUILE_EXECUTABLE} --debug -c "
108+
add_test(NAME ${_TARGET} COMMAND ${GUILE_EXECUTABLE} --debug -c "
110109
(set! %load-hook
111110
(lambda (filename)
112111
(when (and filename
@@ -119,7 +118,7 @@ function(gnc_add_scheme_test _TARGET _SOURCE_FILE)
119118
(exit (run-test))"
120119
)
121120
get_guile_env()
122-
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "${GUILE_ENV};${ARGN}")
121+
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "$<IF:$<CONFIG:Asan>,${GUILE_ENV};${ASAN_DYNAMIC_LIB_ENV};ASAN_OPTIONS=fast_unwind_on_malloc=0;${ARGN},${GUILE_ENV};${ARGN}>")
123122
endfunction()
124123

125124
function(gnc_add_scheme_tests _SOURCE_FILES)

libgnucash/backend/xml/test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ set(XML_TEST_INCLUDE_DIRS
1313
)
1414

1515

16-
set(XML_TEST_LIBS gnc-engine gnc-test-engine test-core ${LIBXML2_LDFLAGS} -lz)
16+
set(XML_TEST_LIBS gnc-backend-xml-utils gnc-engine gnc-test-engine test-core ${LIBXML2_LDFLAGS} -lz)
1717
set(XML_GTEST_LIBS ${XML_TEST_LIBS} gtest)
1818

1919
function(add_xml_test _TARGET _SOURCE_FILES)

0 commit comments

Comments
 (0)