AddressSanitizer
Detecte erros de memória
AddressSanitizer é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 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.
O que é AddressSanitizer?
AddressSanitizer (ASan) é uma ferramenta baseada em compilador que detecta erros de memória em tempo de execução: acesso fora dos limites, uso após liberação, dupla liberação e vazamentos. É rápido o suficiente para testes do dia a dia.
Ativando o ASan
Adicione -fsanitize=address tanto durante a compilação quanto durante a vinculação, além de -g para obter relatórios legíveis.
g++ -fsanitize=address -g -O1 main.cpp -o app
./appEstouro de buffer da memória dinâmica
O ASan sinaliza leituras e gravações além dos limites de um buffer alocado. Este programa grava um elemento além do limite.
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}Uso após liberação
Acessar a memória depois que ela foi liberada é comportamento indefinido; o ASan relata um uso de memória dinâmica após liberação com as pilhas de liberação e alocação.
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}Estouro de buffer da pilha
O ASan também instrumenta matrizes na pilha, detectando estouros de buffers locais.
#include <iostream>
int main() {
int buf[3] = {0, 0, 0};
for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
std::cout << buf[0] << "\n";
return 0;
}Lendo o relatório
Um relatório do ASan informa o tipo de erro, o endereço que causou a falha e os rastreamentos da pilha para o acesso inválido e para a alocação/liberação relevante. O primeiro quadro da pilha geralmente aponta diretamente para o erro.
Detecção de vazamentos
O ASan inclui o LeakSanitizer em muitas plataformas, relatando a memória que nunca foi liberada ao sair do programa, junto com a pilha de alocação.
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}Opções de execução
Ajuste o comportamento com a variável de ambiente ASAN_OPTIONS, por exemplo, ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.
Custo de desempenho
O ASan normalmente torna os programas cerca de duas vezes mais lentos e aumenta o uso de memória. Isso é aceitável para testes e CI, mas você não deve lançar uma compilação de produção com ele ativado.
Combine com testes
Execute seus testes unitários sob o ASan na CI. Muitos erros reais só aparecem quando são exercitados por testes com os sanitizadores ativados. Mantenha uma configuração de compilação dedicada aos sanitizadores.
Não substitui o cuidado
O ASan encontra erros apenas nos caminhos de código que você realmente executa. Combine-o com uma boa cobertura de testes; uma ramificação com erro que não seja exercitada continuará oculta.
Verificação rápida
Relembre como ativar o ASan.
Recapitulação
Você aprendeu sobre o AddressSanitizer.
- Detecta acessos fora dos limites, uso após liberação, dupla liberação e vazamentos
- Ative com
-fsanitize=address -g - Os relatórios informam o erro e mostram as pilhas de alocação/liberação
- Cerca de duas vezes mais lento; ideal para testes e CI, não para lançamentos
Perguntas Frequentes
A aula “AddressSanitizer” é grátis?
Sim — o texto completo de “AddressSanitizer” é 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 “AddressSanitizer”?
Detecte erros de memória 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 2 de 4.
Quanto tempo leva a aula “AddressSanitizer”?
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
- Uso de gdb e lldb
- AddressSanitizer
- UBSan e TSan
- Noções básicas de Valgrind