Существует также специфическое для клана решение: настроить его способ выхода с помощью переменной среды ASAN_OPTIONS
. (См. https://github.com/google/sanitizers/wiki/AddressSanitizerFlags .) Для этого установите для переменной среды ASAN_OPTIONS
значение abort_on_error=0
. Когда дезинфицирующее средство для адреса обнаруживает проблему, тогда процесс будет работать _exit(1)
, а не (предположительно) abort()
, и, таким образом, он, кажется, прекратит свое действие. Затем вы можете выбрать это, используя механизм cmake WILL_FAIL
. (Пока неясно, почему OS X и Linux отличаются в этом отношении - но там вы идете.)
В качестве бонуса тест выходит из строя намного быстрее.
(Еще одна удобная опция который может улучшить время обработки при прохождении через cmake, заключается в том, чтобы установить ASAN_SYMBOLIZER_PATH
на пустое значение, которое останавливает дезинфицирующее средство адреса, символизирующее трассировку стека. Символирование занимает некоторое время, но нет смысла делать это при запуске через cmake, (см. вывод.)
Вместо этого вручную, я создал скрипт Python, который соответствующим образом устанавливает среду на OS X (ничего не делая на Linux) и вызывает тест. Затем я добавляю каждый асин-тест с использованием макроса по линии ответа Цыварева.
macro(add_asan_test basename)
add_executable(${basename} ${basename}.c)
add_test(NAME test/${basename} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/wrap_clang_sanitizer_test.py -a $)
set_tests_properties(test/${basename} PROPERTIES WILL_FAIL TRUE)
endmacro()
Это дает простой проход / сбой как можно быстрее. Я имею обыкновение исследовать сбои, запустив соответствующий тест из оболочки вручную и изучая вывод, и в этом случае я получаю трассировку стека как обычно (и факт, выходящий из abort
, немного медленнее, меньше проблемы).
(Аналогичные варианты для других дезинфицирующих средств, но я их не исследовал.)