0Pricing
C++ Academy · Aula

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

Estouro 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

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