0Pricing
C++ Academy · Lección

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
./app

Desbordamiento 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

  1. Uso de gdb y lldb
  2. AddressSanitizer
  3. UBSan y TSan
  4. Conceptos básicos de Valgrind
← Volver a C++ Academy