AddressSanitizer
Обнаруживайте ошибки памяти
«AddressSanitizer» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое AddressSanitizer?
AddressSanitizer (ASan) — основанный на компиляторе инструмент, который обнаруживает ошибки памяти во время выполнения: выход за границы, использование после освобождения, двойное освобождение и утечки. Он достаточно быстр для повседневного тестирования.
Включение ASan
Добавляйте -fsanitize=address и на этапе компиляции, и на этапе компоновки, а также -g для удобных для чтения отчётов.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appПереполнение буфера в куче
ASan обнаруживает чтение и запись за пределами выделенного буфера. Эта программа записывает на один элемент дальше допустимой границы.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Использование после освобождения
Доступ к памяти после её освобождения — неопределённое поведение; ASan сообщает об использовании кучи после освобождения и показывает стеки освобождения и выделения памяти.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Переполнение буфера в стеке
ASan также инструментирует массивы в стеке и обнаруживает выходы за границы локальных буферов.
#include <iostream>
int main() {
int buf[3] = {0, 0, 0};
for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
std::cout << buf[0] << "\n";
return 0;
}Чтение отчёта
В отчёте ASan указываются тип ошибки, адрес сбоя и трассировки стека для ошибочного доступа, а также соответствующие операции выделения и освобождения памяти. Первый кадр стека обычно указывает прямо на ошибку.
Обнаружение утечек
На многих платформах ASan включает LeakSanitizer, который при завершении программы сообщает о неосвобождённой памяти и показывает стек её выделения.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Параметры выполнения
Настраивайте поведение с помощью переменной окружения ASAN_OPTIONS, например ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Цена производительности
Обычно ASan замедляет программы примерно в 2 раза и увеличивает потребление памяти. Для тестов и CI это приемлемо, но выпускать сборку с включённым ASan не следует.
Сочетание с тестами
Запускайте модульные тесты под ASan в CI. Многие реальные ошибки проявляются только при выполнении тестов с включёнными санитайзерами. Поддерживайте отдельную конфигурацию сборки с санитайзерами.
Не заменяет осторожность
ASan находит ошибки только на реально выполняемых путях кода. Сочетайте его с хорошим покрытием тестами: неисследованная ошибочная ветка останется скрытой.
Быстрая проверка
Вспомните, как включить ASan.
Повторение
Вы изучили AddressSanitizer.
- Обнаруживает выходы за границы, использование после освобождения, двойное освобождение и утечки
- Включается с помощью
-fsanitize=address -g - В отчётах указываются ошибки и показываются стеки выделения и освобождения памяти
- Замедляет примерно в 2 раза; отлично подходит для тестов и CI, но не для выпускных сборок
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «AddressSanitizer» бесплатный?
Да — полный текст урока «AddressSanitizer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «AddressSanitizer»?
Обнаруживайте ошибки памяти Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «AddressSanitizer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Использование gdb и lldb
- AddressSanitizer
- UBSan и TSan
- Основы Valgrind