falha de segmentação em 14.04, mas não falhou em 10.04

falha de segmentação em 14.04, mas não falhou em 10.04

Estou usando o Ubuntu 14.04 64bit LTS e estou escrevendo um programa de processamento de imagem em C. Quando estou executando qualquer programa no terminal ele mostra falha de segmentação (core dumped).
O mesmo programa funciona bem em 10.04.

Alguma ajuda, por favor?

$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)

Responder1

É difícil dizer o que realmente aconteceu em detalhes, mas darei um exemplo do tipo de problema.

O importante é que o programa funcionou no 10.04, mas falhou no 14.0. O problema exato pode ser diferente, mas semelhante e relacionado:

Algo está contra as regras

O erro "falha de segmentação" geralmente significa que foi acessada alguma memória que não pertence ao programa. Pode ser que tanto no dia 10.04 quanto no dia 14.04 tenha havido um acesso ilegal à memória, mas não causou nenhum problema no dia 10.04.

As regras não são rigorosamente aplicadas

Isso significaria que funcionou por acaso no 10.04; Isso é bem possível, porque, por vários motivos, a memória próxima à memória "oficial" do seu programa também pode pertencer tecnicamente ao seu programa.
Isso facilita o trabalho do compilador ou torna o programa mais rápido com acesso mais regular à memória.
Com isso, o programa pode ter permissão para fazer coisas que não é permitido com base no texto do programa.

A tolerância pode mudar

Qual memória "não oficial" você pode acessar sem falha de segmentação depende da versão do compilador e das versões da biblioteca, que foram alteradas.

O caso mais simples e comum deve ser que haja um bug no programa em que o acesso à memória foi muito longe, como acessar o byte após um array por um erro de um por um no índice.

Resumo

O bug existia antes, mas funcionou mesmo assim.
Agora não funciona e é apenas um bug normal que causa uma falha de segmentação.

Para um aspecto positivo: quando funcionou, com o bug, pode ter gerado resultados errados – o que é muito pior do que o crash que você vê agora.


Aplicar as regras

Uma boa abordagem para depurar esse tipo de problema é instrumentar o programa para impor regras que não são impostas pelo sistema de tempo de execução normal.
Uma ferramenta para fazer isso ao procurar problemas de acesso à memória évalgrind(man valgrind).

informação relacionada