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 Também na biblioteca
Cache em PHP: Redis, Memcached e soluções integradas
Trabalho com XML em Go (Golang): biblioteca padrão encoding/xml
Trabalhando com Excel em Swift no iOS e macOS: bibliotecas e exemplos
Guia completo do Micrometer para Java com exemplos práticos