Почему исправленная адресная сборка библиотеки C++ дает невоспроизводимые проблемы ASAN в классах libcxx?

При сборке с параметром -fsanitize=address я иногда вижу проблемы с доступом к памяти из классов libc++.

Ошибки не повторяются от запуска к запуску, а иногда вообще не возникают.

Что случилось? Как я могу предотвратить это?


person jbcoe    schedule 20.10.2016    source источник


Ответы (1)


«Если контейнеры libc++ переходят от инструментированного (перестроенного с помощью ASan) к неинструментальному коду, Address Sanitizer может сообщать о ложных срабатываниях переполнения контейнера».

Если ваша программа линкуется с библиотеками, созданными с помощью libc++ без ASAN, вам необходимо определить _LIBCXX_HAS_NO_ASAN при сборке.

См. Почему Xcode определить _LIBCPP_HAS_NO_ASAN при создании сборки с очисткой адресов?

person jbcoe    schedule 20.10.2016
comment
Кроме того, причиной может быть ваш собственный код - если вы получаете доступ к вектору за пределами границ, о проблеме может быть сообщено в std::vector::operator[], но фактическим виновником является вызывающая сторона, которая отвечает за проверку собственных границ. - person Matteo Italia; 21.10.2016
comment
Правда, я ожидаю, что это будет повторяться от запуска к запуску. - person jbcoe; 21.10.2016