Очиститель памяти / адреса vs Valgrind

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

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

1 ответ

Решение

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

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

  • намного меньшая нагрузка на процессор (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, чтобы поймать все типы ошибок

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

Другие вопросы по тегам