0Pricing
C++ Academy · Lección

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

Desbordamiento 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 << 40 para 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 app

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

Ejemplo 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-recover para 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.

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