C++ Academy · Урок

Санитайзеры: Address, Thread, UB Sanitizer

Находите ошибки памяти, многопоточности и неопределённого поведения с помощью семейства санитайзеров.

Урок 2 из 415 шагов

«Санитайзеры: 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:12

ThreadSanitizer (TSan)

Обнаруживает состояния гонки данных и другие ошибки параллельного выполнения. Замедление составляет примерно 5–15 раз.

g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accesses

Санитайзер неопределённого поведения (UBSan)

Обнаруживает переполнение знакового целого числа, разыменование нулевого указателя, невыровненный доступ, деление на ноль и другие проблемы.

g++ -fsanitize=undefined -g main.cpp

MemorySanitizer (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 — локальная установка не требуется.

Все уроки этого курса

  1. Инструменты статического анализа: clang-tidy, cppcheck
  2. Санитайзеры: Address, Thread, UB Sanitizer
  3. Фаззинг с libFuzzer
  4. Непрерывная интеграция для проектов C++
← Назад к C++ Academy