C++ Academy · Урок

AddressSanitizer

Обнаруживайте ошибки памяти

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

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

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

  1. Использование gdb и lldb
  2. AddressSanitizer
  3. UBSan и TSan
  4. Основы Valgrind
← Назад к C++ Academy