Санитайзеры: Address, Thread, UB Sanitizer
Находите ошибки памяти, многопоточности и неопределённого поведения с помощью семейства санитайзеров.
«Санитайзеры: Address, Thread, UB Sanitizer» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Средства проверки во время выполнения
Санитайзеры — это встроенные в Clang и GCC средства проверки во время выполнения, с инструментированием на этапе компиляции. Они обнаруживают ошибки, которые не может выявить система типов.
AddressSanitizer (ASan)
Обнаруживает ошибки памяти: переполнение буфера, использование после освобождения, двойное освобождение и утечки. Замедление составляет примерно 2 раза.
g++ -fsanitize=address -g -O1 main.cpp
./a.outПример вывода ASan
Когда ASan обнаруживает ошибку, он выводит трассировку стека с точной строкой и типом ошибки.
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer (TSan)
Обнаруживает состояния гонки данных и другие ошибки параллельного выполнения. Замедление составляет примерно 5–15 раз.
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accessesСанитайзер неопределённого поведения (UBSan)
Обнаруживает переполнение знакового целого числа, разыменование нулевого указателя, невыровненный доступ, деление на ноль и другие проблемы.
g++ -fsanitize=undefined -g main.cppMemorySanitizer (MSan)
Обнаруживает чтение неинициализированной памяти. Работает только с Clang. Требует сборки всей программы, включая библиотеки, под управлением MSan.
LeakSanitizer
Поставляется вместе с ASan в Linux. Сообщает о памяти, которая всё ещё выделена при завершении программы.
ASAN_OPTIONS=detect_leaks=1 ./a.outСанитайзеры — NOT бесплатны
Все санитайзеры замедляют программы и используют больше памяти. Применяйте их при разработке и в CI, но не в выпусках для production.
Нельзя объединить все средства
ASan, TSan и MSan нельзя использовать одновременно: они по-разному инструментируют память. UBSan можно объединять с остальными средствами.
Поддержка компиляторами
GCC поддерживает ASan, TSan и UBSan. Clang поддерживает все перечисленные средства, а также MSan. Флаги одинаковы для разных компиляторов.
Интеграция с CI
Запускайте набор тестов под каждым санитайзером в CI. Обнаруживайте состояния гонки и ошибки памяти до выпуска программы. Для наилучшего покрытия сочетайте это с фаззингом.
Совет: собирайте с -O1
При сборке с санитайзерами оптимизируйте код как минимум с уровнем -O1. Уровень -O0 работает, но встраивает меньше функций, из-за чего трассировки стека становятся менее информативными.
Файлы подавления
Для известных ложных срабатываний или проблем сторонних компонентов создайте файл подавления и укажите санитайзеру игнорировать их.
ASAN_OPTIONS="suppressions=asan.supp" ./a.outБыстрая проверка
Какой санитайзер обнаруживает состояния гонки между потоками?
Итоги
Санитайзеры обнаруживают реальные ошибки во время выполнения: AddressSanitizer — ошибки памяти, ThreadSanitizer — состояния гонки, UBSan — неопределённое поведение, MSan — чтение неинициализированной памяти. Для существенного повышения надёжности объединяйте их с набором тестов в CI.
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Санитайзеры: Address, Thread, UB Sanitizer» бесплатный?
Да — полный текст урока «Санитайзеры: Address, Thread, UB Sanitizer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Санитайзеры: Address, Thread, UB Sanitizer»?
Находите ошибки памяти, многопоточности и неопределённого поведения с помощью семейства санитайзеров. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Санитайзеры: Address, Thread, UB Sanitizer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Инструменты статического анализа: clang-tidy, cppcheck
- Санитайзеры: Address, Thread, UB Sanitizer
- Фаззинг с libFuzzer
- Непрерывная интеграция для проектов C++