O que é um Segmentation Fault? Acesso ilegal à memória
Um segmentation fault (segfault) é um crash que o sistema operacional dispara quando um programa tenta ler ou escrever memória que não tem permissão de tocar.
O sistema operacional dá a cada programa uma região definida de memória. Se o programa alcança fora dessa região, dereferencia um ponteiro inválido ou escreve em memória somente leitura, o OS o interrompe imediatamente com um segmentation fault. Segfaults são mais comuns em linguagens com gerenciamento manual de memória, como C e C++, onde ponteiros podem dar errado.
O que dispara um segfault
Um segfault significa que o programa acessou memória que não deveria. O OS usa proteção de memória para impor fronteiras, e cruzar uma (um ponteiro ruim, um índice fora dos limites em código não gerenciado) aciona essa proteção e mata o processo na hora.
Causas comuns
- Dereferenciar um ponteiro null ou não inicializado.
- Ler ou escrever além do fim de um array (buffer overflow).
- Usar memória depois de ela ter sido liberada (use-after-free).
- Escrever em memória que o OS marcou como somente leitura.
Por que linguagens gerenciadas raramente dão segfault
Linguagens com bounds checking e garbage collection (Java, Python, JavaScript) capturam acessos ruins e lançam exceptions em vez de dar segfault. Segfaults normalmente aparecem em C, C++, ou via extensões nativas e chamadas FFI para código não gerenciado.
Depurando um segfault
Um debugger ou um core dump mostra onde o programa travou e o estado da memória naquele ponto. Ferramentas como AddressSanitizer e Valgrind capturam acessos inválidos mais cedo, muitas vezes apontando a linha exata que usou mal um ponteiro.
Um exemplo rápido
Em C, escrever int *p = NULL; *p = 5; dereferencia um ponteiro null. O OS detecta a escrita ilegal e encerra o programa com um segmentation fault.
Segfaults no CI
Um segfault em um teste normalmente é um bug real e determinístico em código nativo, mas também pode sinalizar uma dependência nativa flaky ou uma toolchain corrompida. A Latchkey dá retry automático quando um segfault parece transitório (um passo nativo conhecidamente flaky) enquanto ainda revela crashes repetíveis para que bugs de memória genuínos não fiquem escondidos.
Principais conclusões
- Um segmentation fault é o OS matando um programa por acessar memória que ele não tem permissão de acessar.
- As causas incluem dereferências de null pointer, buffer overflows e use-after-free.
- Aparecem principalmente em linguagens de memória manual; linguagens gerenciadas lançam exceptions em vez disso.