AddressSanitizer
Detecte errores de memoria
AddressSanitizer es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué es AddressSanitizer?
AddressSanitizer (ASan) es una herramienta basada en el compilador que detecta errores de memoria durante la ejecución: accesos fuera de los límites, uso después de liberar, liberación doble y fugas. Es lo bastante rápida para las pruebas diarias.
Habilitar ASan
Añada -fsanitize=address tanto al compilar como al enlazar, además de -g para obtener informes legibles.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appDesbordamiento del búfer del heap
ASan detecta las lecturas y escrituras que superan los límites de un búfer asignado. Este programa escribe un elemento de más.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Uso después de liberar
Acceder a memoria después de liberarla es un comportamiento indefinido; ASan informa de un heap-use-after-free con las pilas de llamadas donde se liberó y se asignó la memoria.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Desbordamiento del búfer de la pila
ASan también instrumenta los arrays de la pila y detecta los desbordamientos de los búferes locales.
#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;
}Leer el informe
Un informe de ASan indica el tipo de error, la dirección que causó el fallo y las pilas de llamadas del acceso incorrecto, así como de la asignación y la liberación relevantes. El primer marco de la pila suele señalar directamente el error.
Detección de fugas
ASan incluye LeakSanitizer en muchas plataformas e informa de la memoria que nunca se liberó al salir del programa, junto con la pila de llamadas de la asignación.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Opciones de ejecución
Ajuste el comportamiento con la variable de entorno ASAN_OPTIONS, por ejemplo, ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Coste de rendimiento
ASan suele ralentizar los programas aproximadamente 2 veces y aumenta el uso de memoria. Esto es aceptable para las pruebas y la integración continua, pero no se debe distribuir una compilación de producción con ASan habilitado.
Combinarlo con las pruebas
Ejecute las pruebas unitarias bajo ASan en la integración continua. Muchos errores reales solo aparecen cuando las pruebas se ejecutan con los sanitizers habilitados. Mantenga una configuración de compilación específica para sanitizers.
No sustituye a la precaución
ASan solo encuentra errores en las rutas de código que realmente se ejecutan. Combínelo con una buena cobertura de pruebas; una rama con errores que no se ejecuta permanece oculta.
Comprobación rápida
Recuerde cómo habilitar ASan.
Repaso
Ha aprendido a usar AddressSanitizer.
- Detecta accesos fuera de los límites, uso después de liberar, liberación doble y fugas
- Se habilita con
-fsanitize=address -g - Los informes indican el error y muestran las pilas de asignación y liberación
- Es aproximadamente 2 veces más lento; ideal para pruebas e integración continua, no para versiones de producción
Preguntas frecuentes
¿La lección «AddressSanitizer» es gratis?
Sí — el texto completo de «AddressSanitizer» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «AddressSanitizer»?
Detecte errores de memoria Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «AddressSanitizer»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Uso de gdb y lldb
- AddressSanitizer
- UBSan y TSan
- Conceptos básicos de Valgrind