AddressSanitizer para C++: guia completo com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

AddressSanitizer para C++: guia completo para detectar erros de memória

1. O que é e por que usar

O AddressSanitizer (ASan) não é uma biblioteca no sentido tradicional, mas sim uma ferramenta poderosa de análise dinâmica de código, integrada aos compiladores Clang e GCC. Ele foi projetado para detectar erros de gerenciamento de memória durante a execução do programa. Desenvolvido pela equipe do Google, o ASan se tornou o padrão de facto para encontrar defeitos perigosos como estouro de buffer (buffer overflow), uso de memória após liberação (use-after-free), dupla liberação (double-free) e vazamentos de memória (memory leaks).

Por que isso é importante? Erros de memória estão entre os mais traiçoeiros em C++. Eles podem passar despercebidos por anos, causando falhas aleatórias, corrupção de dados ou vulnerabilidades de segurança. Depuradores tradicionais muitas vezes são inúteis, pois o programa pode falhar longe do local real do erro. O ASan resolve esse problema instrumentando o código durante a compilação: ele adiciona verificações em torno de cada operação de memória (malloc, new, free, delete, leitura/escrita por ponteiros). Ao detectar uma anomalia, o ASan interrompe imediatamente o programa e exibe um stack trace detalhado com a linha exata do código, o tipo de erro e o estado da memória.

Para o site educacional PythonLib, é importante entender: embora o Python gerencie a memória automaticamente, conhecer o ASan é útil para desenvolvedores C++ que criam aplicações de alta carga ou críticas para a segurança. O ASan se integra a pipelines de CI/CD, permitindo capturar bugs antes de chegarem à produção. Ele funciona em Linux, macOS, Windows e FreeBSD, e suporta C, C++ e Objective-C.

2. Instalação

O AddressSanitizer não é instalado separadamente — ele faz parte do compilador. Você precisa do Clang (versão 3.1+) ou GCC (versão 4.8+).

Instalação do compilador (exemplo para Ubuntu/Debian):

sudo apt update
sudo apt install clang-14  # ou g++-11

Para macOS: As Ferramentas de Linha de Comando do Xcode incluem o Clang com ASan.

xcode-select --install

Para Windows: Use o Visual Studio 2019+ (ative a flag /fsanitize=address) ou instale o Clang via LLVM.

Verificando o suporte:

clang++ -fsanitize=address --version
g++ -fsanitize=address --version

3. Início rápido — exemplo mínimo funcional

Crie um arquivo exemplo.cpp com um erro intencional (uso após liberação):

#include <iostream>

int main() {
    int* p = new int(42);
    delete p;
    std::cout << *p << std::endl;  // Erro: use-after-free
    return 0;
}

Compile e execute com ASan:

clang++ -fsanitize=address -g -o exemplo exemplo.cpp
./exemplo

Você verá um relatório detalhado com a linha exata, o tipo de erro e a pilha de chamadas. Sem o ASan, o programa poderia exibir 42 ou travar com segmentation fault.

4. Principais métodos/funções/classes

O AddressSanitizer não fornece uma API para ser chamada diretamente no código — ele funciona automaticamente. No entanto, existem macros e funções auxiliares para ajustes finos e integração. Veja 8 elementos-chave.

4.1. __asan_address_is_poisoned()

Assinatura: int __asan_address_is_poisoned(void const *addr);

O que faz: Verifica se uma região de memória está marcada como "envenenada" (inacessível). Retorna 1 se o endereço estiver em uma zona envenenada, caso contrário 0.

Exemplo:

#include <sanitizer/asan_interface.h>
#include <iostream>

int main() {
    int* arr = new int[10];
    arr[5] = 100;
    // Verifica se o endereço arr+10 (fora do array) está envenenado
    if (__asan_address_is_poisoned(arr + 10)) {
        st                    

Recommendations