Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan
Encuentre errores de memoria, concurrencia y comportamiento indefinido con la familia de sanitizers.
Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan 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.
Comprobadores en tiempo de ejecución
Los sanitizers son comprobadores en tiempo de ejecución instrumentados durante la compilación e integrados en Clang y GCC. Detectan errores que el sistema de tipos no puede detectar.
AddressSanitizer (ASan)
Detecta errores de memoria: desbordamientos de búfer, uso después de liberar, doble liberación y fugas. La ralentización es de aproximadamente 2 veces.
g++ -fsanitize=address -g -O1 main.cpp
./a.outEjemplo de salida de ASan
Cuando ASan detecta un error, muestra un seguimiento de la pila con la línea exacta y el tipo de error.
==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
#0 0x... in main main.cpp:12ThreadSanitizer (TSan)
Detecta condiciones de carrera y otros errores de concurrencia. La ralentización es de aproximadamente 5 a 15 veces.
g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accessesUndefined Behavior Sanitizer (UBSan)
Detecta desbordamientos de enteros con signo, desreferencias de punteros nulos, accesos desalineados, divisiones entre cero y mucho más.
g++ -fsanitize=undefined -g main.cppMemorySanitizer (MSan)
Detecta lecturas de memoria no inicializada. Solo está disponible en Clang. Requiere compilar todo el programa (incluidas las bibliotecas) con MSan.
LeakSanitizer
Se incluye con ASan en Linux. Informa de la memoria que sigue asignada al salir del programa.
ASAN_OPTIONS=detect_leaks=1 ./a.outLos sanitizers NO son gratuitos
Todos los sanitizers ralentizan los programas y utilizan más memoria. Úselos durante el desarrollo y en CI, no en las versiones de producción.
No se pueden combinar todos
ASan, TSan y MSan son mutuamente excluyentes porque instrumentan la memoria de manera diferente. UBSan se puede combinar con los demás.
Compatibilidad de los compiladores
GCC admite ASan, TSan y UBSan. Clang admite todos los anteriores y también MSan. Las opciones son idénticas en ambos compiladores.
Integración con CI
Ejecute su conjunto de pruebas con cada sanitizer en CI. Detecte condiciones de carrera y errores de memoria antes de publicar el software. Combínelos con fuzzing para obtener la mejor cobertura.
Consejo: compile con -O1
Optimice al menos con -O1 al compilar para usar sanitizers. -O0 funciona, pero realiza menos inlining, lo que hace que los seguimientos de la pila sean menos informativos.
Archivos de supresión
Para falsos positivos conocidos o problemas de terceros, escriba un archivo de supresión e indique al sanitizer que los ignore.
ASAN_OPTIONS="suppressions=asan.supp" ./a.outComprobación rápida
¿Qué sanitizer detecta las condiciones de carrera entre hilos?
Resumen
Los sanitizers detectan errores reales en tiempo de ejecución: AddressSanitizer para errores de memoria, ThreadSanitizer para condiciones de carrera, UBSan para comportamiento indefinido y MSan para lecturas de memoria no inicializada. Combínelos con su conjunto de pruebas en CI para mejorar considerablemente la seguridad.
Preguntas frecuentes
¿La lección «Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan» es gratis?
Sí — el texto completo de «Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan» 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 «Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan»?
Encuentre errores de memoria, concurrencia y comportamiento indefinido con la familia de sanitizers. 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 «Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan»?
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
- Herramientas de análisis estático: clang-tidy y cppcheck
- Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan
- Fuzzing con libFuzzer
- Integración continua para proyectos C++