Если
valgrind — это медленный, но подробный детектив, то ASan — это охрана, которая ловит баги прямо во время исполнения. Быстро, точно, удобно.💡 Что такое ASan?
Это часть компилятора (
clang или gcc), которая вставляет дополнительные проверки в бинарник. Работает во время запуска, ловит:- выход за границы массива,
- use-after-free,
- double free,
- утечки памяти (с флагом
LeakSanitizer).👨💻 Пример:
// asan_example.cpp
#include <iostream>
int main() {
int* arr = new int[5];
arr[10] = 42; // выход за границу
delete[] arr;
return 0;
}
⚙️ Компиляция с ASan:
g++ -fsanitize=address -g asan_example.cpp -o app
🚀 Запуск:
./app
📄 Результат:
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000050
READ of size 4 at 0x602000000050 thread T0
#0 0x... in main asan_example.cpp:6
📌 Плюсы ASan:
- Мгновенная обратная связь;
- Прост в использовании;
- Отлично работает с CI (GitHub Actions, GitLab CI и т.д.);
- Поддерживает LeakSanitizer (
-fsanitize=leak).📉 Минусы:
- Увеличивает размер бинарника;
- Иногда мешает оптимизациям;
- Не ловит всё (например, утечки в сторонних lib без debug info).
🔧 Совет:
Запускай тесты с
-fsanitize=address в debug-сборках. Это бесплатно и спасает от кучи головной боли в будущем.🧵 Используешь ли ты
ASan в своих проектах? Или только valgrind? Пиши в комментах👇➡️ @cpp_geek