O que é uma falha de segmentação no Linux?

Uma falha de segmentação, ou segfault, é um erro de memória no qual um programa tenta acessar um endereço de memória que não existe ou o programa não tem direitos de acesso. É um bug comum em programas C e C ++ mal escritos. Quando um programa atinge uma falha de segmentação, geralmente falha com a frase de erro "Falha de segmentação".

Noções básicas de falha de segmentação

No nível do sistema operacional, o processo de segmentação divide a memória disponível em segmentos. Ao encontrar um erro ao escrever para um segmento de memória, o sistema operacional Unix ou Linux envia um sinal SIGSEGV para o programa, que então trava com a mensagem de "falha de segmentação". Falhas de segmentação são geralmente específicas de linguagens de baixo nível como C, que requerem que o programador aloque memória para um programa em execução, pedaço por pedaço.

Tipos de falhas de segmentação

Falhas de segmentação podem surgir de condições semelhantes. Um estouro de buffer, como tentar sair dos limites de uma matriz, pode causar uma falha de segurança ou tentar acessar a memória que não foi alocada ou foi excluída. Tentar gravar na memória somente leitura também pode causar um erro de memória. Finalmente, em alguns sistemas Unix e Linux, os ponteiros que são inicializados como nulos não podem ser referenciados; isso causará a ocorrência de um segfault.

Evitando Falhas de Segmentação como o Usuário

Se você estiver executando um programa que baixou da Internet e não está familiarizado com o código-fonte, pode estar sem sorte: Tudo o que você pode fazer é enviar um relatório de bug e esperar uma correção. Só para ter certeza, verifique se você está executando a versão mais atualizada do software. Além disso, verifique o site de relatório de bug para ver se o bug já foi relatado e se alguma solução temporária ou patch está disponível para download.

Evitando Falhas de Segmentação como o Programador

A única maneira de evitar segfaults completamente em programas escritos é ter cuidado com as alocações e exclusões de memória e rastrear os erros à medida que eles ocorrem. Encontrar a origem exata do erro pode ser complicado, especialmente porque ele pode não aparecer toda vez que você executa o programa. Além disso, o bug real pode não estar em nenhum lugar perto de onde o programa trava, uma vez que uma alocação de memória defeituosa pode travar o programa apenas quando ele é acessado pela primeira vez. Um depurador pode detectar segfaults conforme eles ocorrem e até mesmo rastreá-los até a linha.