Память/адрес Sanitizer vs Valgrind

Я хочу, чтобы какой-то инструмент позволял диагностировать неполадку пользователя без ошибок и неинициализированные ошибки. Я рассматриваю Sanitizer (память и/или адрес) и Valgrind. Но у меня очень мало информации об их преимуществах и недостатках. Может ли кто-нибудь рассказать о главных особенностях, различиях и плюсах/минусах Sanitizer и Valgrind?

Редактирование: я нашел некоторые сравнения, такие как: Valgrind использует DBI (динамическая двоичная аппаратура), а Sanitizer использует CTI (инструменты для компиляции). Valgrind делает программу намного медленнее (20x), работает ли Sanitizer намного быстрее, чем Valgrind (2x). Если кто-то может дать мне еще несколько важных моментов, то это будет большой помощью.

Ответ 1

Я думаю, вы найдете эту вики полезной.

TL;DR Основные преимущества дезинфицирующих средств:

  • намного меньшая нагрузка на процессор (Lsan практически свободен, UBsan в 1,25 раза, Asan и Msan в 2-4 раза для задач с интенсивными вычислениями и 1,05-1,1x для графических интерфейсов, Tsan в 5-15 раз)
  • более широкий класс обнаруженных ошибок (стек и глобальные переполнения, использование после возврата)
  • полная поддержка многопоточных приложений (шутка поддержка Valgrind для многопоточности)

Недостатки

  • значительные накладные расходы памяти (до 2x для Asan, до 3x для Msan, до 10x для Tsan), что может быть ограничивающим фактором для сред с ограниченными ресурсами (например, телефонов); это все еще намного лучше, чем Valgrind
  • более сложная интеграция (вам нужно научить свою систему сборки понимать Asan и иногда обходить ограничения/ошибки в самом Asan, вам также нужно использовать относительно свежий компилятор)
  • MemorySanitizer на самом деле не очень удобен в настоящее время, так как требует перестройки всех зависимостей в Msan (включая все стандартные библиотеки, например, libstdc++); это означает, что случайные пользователи могут использовать Valgrind только для обнаружения неинициализированных ошибок
  • дезинфицирующие средства обычно не могут быть объединены друг с другом (единственная поддерживаемая комбинация - Asan + UBsan + Lsan), что означает, что вам придется выполнять отдельные прогоны QA для выявления всех типов ошибок.

Ответ 2

Одно существенное отличие состоит в том, что включенные в LLVM средства очистки памяти и потоков неявно отображают огромные полосы адресного пространства (например, путем вызова mmap(X, Y, 0, MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0) через терабайты адресное пространство в среде x86_64). Даже при том, что они не обязательно выделяют эту память, отображение может разрушить ограничивающие среды (например, с разумными настройками для значений ulimit).