Skip to content
Latchkey

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.

Guias relacionados