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
./appEstouro 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 << 40para 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 appAtivando 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
./appUm 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-recoverpara 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.