AddressSanitizer para C++: guía completa para detectar errores de memoria
1. ¿Qué es y para qué sirve?
AddressSanitizer (ASan) no es una biblioteca en el sentido clásico, sino una potente herramienta de análisis dinámico de código integrada en los compiladores Clang y GCC. Está diseñada para detectar errores de gestión de memoria durante la ejecución del programa. Desarrollado por el equipo de Google, ASan se ha convertido en el estándar de facto para encontrar defectos peligrosos como desbordamiento de búfer (buffer overflow), uso de memoria después de liberarla (use-after-free), doble liberación (double-free) y fugas de memoria (memory leaks).
¿Por qué es necesario? Los errores de memoria son de los más traicioneros en C++. Pueden pasar desapercibidos durante años, provocando fallos aleatorios, corrupción de datos o vulnerabilidades de seguridad. Los depuradores tradicionales suelen ser ineficaces, ya que el programa puede fallar lejos del lugar donde ocurre el error real. ASan resuelve este problema instrumentando el código en tiempo de compilación: añade comprobaciones alrededor de cada operación de memoria (malloc, new, free, delete, lectura/escritura mediante punteros). Al detectar una anomalía, ASan detiene el programa inmediatamente y muestra un stack trace detallado con la línea exacta de código, el tipo de error y el estado de la memoria.
Para el sitio educativo PythonLib es importante entender: aunque Python gestiona la memoria automáticamente, conocer ASan es útil para desarrolladores de C++ que escriben aplicaciones de alto rendimiento o críticas para la seguridad. ASan se integra en pipelines de CI/CD, permitiendo detectar errores antes de llegar a producción. Funciona en Linux, macOS, Windows y FreeBSD, y es compatible con C, C++ y Objective-C.
2. Instalación
AddressSanitizer no se instala por separado, ya que forma parte del compilador. Necesitas Clang (versión 3.1+) o GCC (versión 4.8+).
Instalación del compilador (ejemplo para Ubuntu/Debian):
sudo apt update
sudo apt install clang-14 # o g++-11
Para macOS: Xcode Command Line Tools incluye Clang con ASan.
xcode-select --install
Para Windows: Usa Visual Studio 2019+ (activa la bandera /fsanitize=address) o instala Clang a través de LLVM.
Verificar compatibilidad:
clang++ -fsanitize=address --version
g++ -fsanitize=address --version
3. Inicio rápido — ejemplo mínimo funcional
Crea un archivo example.cpp con un error intencional (uso después de liberar memoria):
#include <iostream>
int main() {
int* p = new int(42);
delete p;
std::cout << *p << std::endl; // Error: use-after-free
return 0;
}
Compila y ejecuta con ASan:
clang++ -fsanitize=address -g -o example example.cpp
./example
Verás un informe detallado con la línea exacta, el tipo de error y el stack de llamadas. Sin ASan, el programa podría mostrar 42 o fallar con un segmentation fault.
4. Métodos/funciones/clases principales
AddressSanitizer no proporciona una API para llamar desde el código, ya que funciona automáticamente. Sin embargo, existen macros y funciones auxiliares para ajustes finos e integración. A continuación, 8 elementos clave.
4.1. __asan_address_is_poisoned()
Firma: int __asan_address_is_poisoned(void const *addr);
Qué hace: Verifica si un área de memoria está marcada como "envenenada" (no accesible). Devuelve 1 si la dirección está en una zona envenenada, de lo contrario 0.
Ejemplo:
#include <sanitizer/asan_interface.h>
#include <iostream>
int main() {
int* arr = new int[10];
arr[5] = 100;
// Verificamos si la dirección arr+10 (fuera del array) está envenenada
if (__asan_address_is_poisoned(arr + 10)) {
std::cout << "Dirección fuera de los límites" << std::endl;
}
delete[] arr;
return 0;
}