Os compiladores e intérpretes podem ter bugs, e o que podemos fazer (como usuários) para lidar com eles? [fechadas]


28

Se o trabalho de um compilador estiver traduzindo essencialmente o código fonte para o código no nível da máquina, pode haver alguma falha no compilador, ou seja, uma "tradução" defeituosa?

O mesmo vale para um intérprete: ele pode falhar na saída do conteúdo necessário algumas vezes?

Eu não ouvi nenhum bug em compiladores / intérpretes, mas eles existem?


6
em desenvolvimento que irá certamente existem olhar apenas no bugtracker em qualquer open source compilador
aberração catraca

7
Eu não ouvi nenhum bug em compiladores / intérpretes, mas eles existem? Eu encontrei a lista de endereços para bugs no compilador gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Esta não é uma pergunta muito boa, apenas pede algo que é bom senso.

12
Até agora, nenhum dos comentários ou respostas aborda a probabilidade de encontrar um bug do compilador. Certifique-se de descartar erros no seu próprio código primeiro.
Dan Pichelman 08/07/2013

6
Resposta curta: definitivamente. Embora os IDEs e os compiladores sejam tipicamente exercitados dentro de uma polegada de suas vidas antes que eles vejam o mundo exterior, sempre há um caso em algum lugar que um desenvolvedor que é um pouco inteligente demais encontrará.
8113 KeithS

Respostas:


51

sim

Você tende a encontrá-los mais em idiomas que estão sendo desenvolvidos ativamente do que naqueles que são relativamente maduros (e, portanto, não vêem muitas mudanças frequentemente). É provavelmente por isso que a maioria dos idiomas é lançada em vários 'estágios' de estabilidade. É muito menos provável que uma construção noturna seja estável que um candidato a lançamento , o que é menos provável que seja estável que uma versão totalmente liberada e usada ativamente.

Felizmente, a maioria desses idiomas (especialmente os de código aberto) terá um sistema público de rastreamento de erros ao qual você pode enviar relatórios.

Na minha própria experiência, encontrei um bug bastante obscuro, mas grave, no Scala no Windows . Enviei minhas descobertas ao rastreador de erros e o problema foi corrigido rapidamente. Nesse caso, os desenvolvedores de idiomas foram espertos o suficiente para incluir uma observação útil na saída do log de erros, sugerindo que o que eu encontrei era de fato um erro do compilador e disseram para onde enviar o relatório.


Espero que você não se importe; Adicionei um novo parágrafo (com aprovação pendente) que achei relevante. Um compilador pode não apenas conter erros, mas também códigos maliciosos.
9133 Andy

@ Andy, parece que um dos moderadores o rejeitou como algo que deveria ser um comentário ou resposta separada.
KChaloux

Não apenas "sim", mas "inferno sim!" :-)
Hellion

C é maduro e desenvolvido ativamente. O mesmo acontece com C ++. O mesmo acontece com Java. etc ..
djechlin 10/11/14

100

Nas palavras dos leigos:

Todos os programas podem ter erros.

Compiladores são programas.

Portanto, os compiladores podem ter bugs.


55
Mais preocupante: depuradores são programas. Portanto, os depuradores têm erros.
Daniel Gratzer

19
@jozefg: Então, como você depura o depurador? Quem vigia os observadores?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner Os observadores observadores, duh.
Jimmy Hoffa

9
@ JoelFan Desde que eu escrevi "pode ​​ter", essa exceção é coberta. Se você disser "have", precisará especificar que está se referindo apenas a programas não triviais. Ao dizer "pode ​​ter", você não precisa.
Tulains Córdova

8
Os programas "Hello world" podem ter bugs se estiverem em conformidade com um compilador com bugs.
wtsang02



4

Obviamente, porque compiladores são software.

Em 2005, um código falhou em um software altamente crítico que eu havia escrito para uma grande empresa. Como a empresa literalmente custou milhões de dólares para retificá-la, eles naturalmente iniciaram uma investigação importante.

Felizmente (da minha perspectiva), o problema acabou sendo um problema de compilação no Delphi. No bloco try finalmente, o valor de retorno de uma função foi destruído e resultou em resultados absolutamente aleatórios de volta para o chamador. Isso foi documentado e reconhecido pela Borland.

O .NET era conhecido por ter literalmente centenas de diferentes vazamentos de memória, principalmente em suas implementações iniciais.

Eu diria que não existe software sem erros. Compiladores não são excepção. Eles são, no entanto, testados mais detalhadamente do que a maioria dos softwares de negócios e são consumidos por pessoas inteligentes, críticas e contenciosas; portanto, seu histórico, na verdade, tem sido bastante bom.


Existe um software "formalmente verificado". É matematicamente comprovado para o trabalho. Ocasionalmente, mesmo o código verificado formalmente tem bugs. A implementação do quicksort do IIRC Java foi formalmente verificada, mas isso não foi responsável por estouros.
David Plumpton

11
Qual foi o software? Vamos :)
Rocklan

2

Não apenas erros, mas também malware deliberado.

O trojan "login" implementado por Brian Kernighan no compilador Unix C original é o mais conhecido deles; o artigo http://cm.bell-labs.com/who/ken/trust.html possui alguns antecedentes sobre isso.


11
Está claro que isso foi realmente implementado?
9303 Keith Thompson

Este é um tópico bastante interessante, mas nem um pouco relacionado a esta questão.

@delnan Eu discordo; O cerne da questão parece ser "quanto posso confiar no meu compilador?"
Andy

1

Sim, claro, como qualquer compilador de software tem bugs, por exemplo, a lista de bugs do gcc está aqui


0

Sim.

Além disso, não apenas com compiladores, mas também com intérpretes / depuradores e qualquer ferramenta de software de terceiros.

No momento, estamos usando algum software de terceiros e estamos enfrentando alguns dos problemas. Às vezes, eles nos agradecem por encontrar e relatar um bug. :)

Alguns deles também têm alguns vazamentos de memória, o que leva ao travamento. A questão importante aqui pode ser: como determinar se a ferramenta de terceiros ou o compilador possui bugs para que seu aplicativo funcione corretamente?


Sua pergunta importante vai voltar, em seguida, levar ao problema da parada
wtsang02

0

Compilador é um programa que lê um programa escrito em um idioma (o idioma de origem) e o converte em outro programa equivalente em outro idioma (o idioma de destino), principalmente o idioma de máquina.

Existem diferentes fases do compilador através das quais o código do idioma de origem é verificado linha por linha. Existe uma tabela de símbolos que mantém o controle de todas as palavras-chave pesquisadas no código do idioma de origem.

Fase 1: Lexical Analyzer - lê todo o caractere no programa de origem e forma a separação lógica de tokens (int, char, float, if-else, por, while etc.)

Fase 2: Analisador de Sintaxe - analise a estrutura do fluxo de tokens. Análise hierárquica de expressões que inclui postfix / prefixo etc. (a = b + c * d)

Fase 3: Analisador Semântico - Verificação de tipo de tokens (inteiro para real, flutuante etc.) e muitas coisas como precedência do operador etc.

Fase 4: Gerador de código intermediário - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Fase 5: Otimização de Código - Análise Diversa (fluxo de controle, fluxo de dados, transformações)
que elimina: código de redundância, propagação de constantes, código morto parcial, subexpressão comum, código invariante de loop

Fase 6: Geração de código - geração de código de destino (principalmente Assembly Language) colocando valores nos registros

Todas essas fases nada mais são do que programas bem escritos e pode haver um número N de falhas nisso ..


-1

Obviamente, compiladores são apenas programas e seus autores também são idiotas :). Até a especificação da linguagem pode ter um erro. Exemplo: c # + foreach + lambda .

Ou no Python, erro no intérprete: Compilar o mal ast trava o intérprete .

Bem, se você quiser procurar por bugs no compilador / interpeter -> veja php. Existe um bug famoso com excesso de número inteiro. Primeira correção iniciada em if (size > INT_MAX) return NULL;. Continuação da história .


Os escritores do compilador não são idiotas. Como os compiladores são bastante complicados, a barreira para entrar em campo também é substancialmente mais alta. Portanto, podemos esperar que as pessoas que os escrevem não cometam erros, como os homens comuns.
Jszpilewski

O foreach / lambda não é um bug, ele se resume a uma decisão específica e de design de consciência tomada antes da adição de lambdas.
Andy

@ Andy, como eu sei, ninguém sabia quais problemas essa decisão causará. Por que não bug?
Viktor Lova

@jszpilewski você vê um sorriso depois desse texto?
Viktor Lova

11
Eu sugiro que você releia o OP, já que a pergunta dele não é se as especificações podem ter bugs, mas sim se os COMPILERS podem ter bugs. Como o compilador C # correspondeu à especificação, o compilador não teve um erro. Sugiro também que você reler suas próprias citações Wikipedia "Um erro de software é um erro, falha, falha ou avaria de um programa de computador"
Andy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.