UBSan y TSan
Encuentre comportamientos indefinidos y condiciones de carrera
UBSan y TSan es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 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.
Dos sanitizers más
Además de ASan, hay dos sanitizers que se centran en distintas clases de errores.
- UBSan: comportamiento indefinido (desbordamientos, desplazamientos incorrectos, desreferencias nulas)
- TSan: condiciones de carrera en código multihilo
Habilitar UBSan
UndefinedBehaviorSanitizer se habilita con -fsanitize=undefined. Puede combinarse con ASan.
g++ -fsanitize=undefined -g main.cpp -o app
./appDesbordamiento de enteros con signo
El desbordamiento de enteros con signo es un comportamiento indefinido en C++. UBSan lo informa exactamente en la línea donde ocurre.
#include <climits>
#include <iostream>
int main() {
int x = INT_MAX;
int y = x + 1; // signed overflow: UB
std::cout << y << "\n";
return 0;
}Otros comportamientos indefinidos que detecta UBSan
UBSan detecta muchos errores sutiles.
- Desplazamientos fuera de rango (
x << 40para un int de 32 bits) - Desreferencia de punteros nulos
- Accesos desalineados
- Valores de enum o bool no válidos
Hacer que UBSan se detenga
De forma predeterminada, UBSan muestra el error y continúa. Añada -fno-sanitize-recover=undefined para abortar ante el primer error, lo que resulta mejor para la integración continua.
g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o appHabilitar TSan
ThreadSanitizer se habilita con -fsanitize=thread. Detecta condiciones de carrera: dos hilos acceden a la misma memoria sin sincronización y al menos uno de ellos escribe.
g++ -fsanitize=thread -g main.cpp -o app -pthread
./appEjemplo de condición de carrera
Dos hilos incrementan un contador compartido sin un bloqueo. TSan informa de los accesos en conflicto y sus pilas de llamadas.
#include <thread>
#include <iostream>
int counter = 0;
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}Corregir la condición de carrera
Proteja los datos compartidos con un mutex o use std::atomic. Después de corregir el problema, TSan no informa de ninguna condición de carrera.
#include <thread>
#include <atomic>
#include <iostream>
std::atomic<int> counter{0};
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}Compatibilidad entre TSan y ASan
TSan no se puede combinar con ASan en la misma compilación (entran en conflicto). Use configuraciones de compilación separadas: una para ASan+UBSan y otra para TSan.
Matriz de compilaciones con sanitizers
Una configuración práctica de integración continua ejecuta el conjunto de pruebas en dos compilaciones con sanitizers.
- Compilación A:
-fsanitize=address,undefined - Compilación B:
-fsanitize=thread
Esto cubre errores de memoria, de comportamiento indefinido y de concurrencia.
Coste y limitaciones
TSan puede ralentizar los programas entre 5 y 15 veces y utilizar mucha más memoria. Como todos los sanitizers, solo detecta errores en las rutas de código ejecutadas, por lo que son importantes unas buenas pruebas multihilo.
Comprobación rápida
Recuerde qué detecta TSan.
Repaso
Ha aprendido a usar UBSan y TSan.
- UBSan (
-fsanitize=undefined) detecta desbordamientos, desplazamientos incorrectos y desreferencias nulas - Use
-fno-sanitize-recoverpara abortar ante el primer comportamiento indefinido - TSan (
-fsanitize=thread) detecta condiciones de carrera; corríjalas con un mutex o un tipo atómico - TSan y ASan necesitan compilaciones separadas
Preguntas frecuentes
¿La lección «UBSan y TSan» es gratis?
Sí — el texto completo de «UBSan y TSan» 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 «UBSan y TSan»?
Encuentre comportamientos indefinidos y condiciones de carrera 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 3 de 4.
¿Cuánto tiempo toma la lección «UBSan y TSan»?
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.