0Pricing
C++ Academy · Aula

UBSan e TSan

Encontre comportamentos indefinidos e condições de corrida

UBSan e TSan é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Mais dois sanitizadores

Além do ASan, dois sanitizadores têm como alvo diferentes classes de erros.

  • UBSan: comportamento indefinido (estouro, deslocamentos inválidos, desreferência de nulo)
  • TSan: condições de corrida de dados em código multithread

Ativando o UBSan

O UndefinedBehaviorSanitizer é ativado com -fsanitize=undefined. Ele pode ser combinado com o ASan.

g++ -fsanitize=undefined -g main.cpp -o app
./app

Estouro de inteiros com sinal

O estouro de inteiros com sinal é comportamento indefinido em C++. O UBSan o relata exatamente na linha correspondente.

#include <climits>
#include <iostream>

int main() {
    int x = INT_MAX;
    int y = x + 1; // signed overflow: UB
    std::cout << y << "\n";
    return 0;
}

Outros casos de UB detectados pelo UBSan

O UBSan sinaliza muitos erros sutis.

  • Deslocamentos fora do intervalo (x << 40 para um inteiro de 32 bits)
  • Desreferência de ponteiro nulo
  • Acesso desalinhado
  • Valores inválidos de enumeração ou booleanos

Fazendo o UBSan interromper a execução

Por padrão, o UBSan imprime o erro e continua. Adicione -fno-sanitize-recover=undefined para abortar no primeiro erro, o que é melhor para a CI.

g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o app

Ativando o TSan

O ThreadSanitizer é ativado com -fsanitize=thread. Ele detecta condições de corrida de dados: duas threads acessando a mesma memória sem sincronização, sendo que pelo menos uma delas escreve.

g++ -fsanitize=thread -g main.cpp -o app -pthread
./app

Um exemplo de condição de corrida

Duas threads incrementam um contador compartilhado sem um bloqueio. O TSan relata os acessos em disputa e suas pilhas.

#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;
}

Corrigindo a condição de corrida

Proteja os dados compartilhados com um mutex ou use std::atomic. Depois da correção, o TSan não relata nenhuma condição de corrida.

#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;
}

Compatibilidade entre TSan e ASan

O TSan não pode ser combinado com o ASan na mesma compilação (eles entram em conflito). Use configurações de compilação separadas: uma para ASan+UBSan e outra para TSan.

Matriz de compilação dos sanitizadores

Uma configuração prática de CI executa o conjunto de testes em duas compilações com sanitizadores.

  • Compilação A: -fsanitize=address,undefined
  • Compilação B: -fsanitize=thread

Isso abrange erros de memória, UB e concorrência.

Custo e limitações

O TSan pode tornar os programas de 5 a 15 vezes mais lentos e usar muito mais memória. Como todos os sanitizadores, ele só detecta erros nos caminhos de código executados; por isso, bons testes multithread são importantes.

Verificação rápida

Relembre o que o TSan detecta.

Recapitulação

Você aprendeu sobre UBSan e TSan.

  • O UBSan (-fsanitize=undefined) encontra estouros, deslocamentos inválidos e desreferências de nulo
  • Use -fno-sanitize-recover para abortar no primeiro caso de UB
  • O TSan (-fsanitize=thread) encontra condições de corrida de dados; corrija-as com mutex/atômico
  • TSan e ASan precisam de compilações separadas

Perguntas Frequentes

A aula “UBSan e TSan” é grátis?

Sim — o texto completo de “UBSan e TSan” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “UBSan e TSan”?

Encontre comportamentos indefinidos e condições de corrida Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “UBSan e TSan”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Uso de gdb e lldb
  2. AddressSanitizer
  3. UBSan e TSan
  4. Noções básicas de Valgrind
← Voltar para C++ Academy