I compilatori e gli interpreti possono avere bug e cosa possiamo fare (come utenti) per gestirli? [chiuso]


28

Se il lavoro di un compilatore sta essenzialmente traducendo il codice sorgente in codice a livello di macchina, può esserci qualche problema tecnico in un compilatore, cioè una "traduzione" difettosa?

Lo stesso vale per un interprete: a volte può non riuscire a produrre il contenuto richiesto?

Non ho sentito parlare di bug nei compilatori / interpreti, ma esistono?


6
nello sviluppo sicuramente esisteranno, basta guardare il bugtracker su qualsiasi compilatore open source
maniaco del cricchetto

7
Non ho sentito parlare di bug nei compilatori / interpreti, ma esistono? Ho trovato la mailing list per i bug nel compilatore gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Questa non è davvero una bella domanda, si limita a chiedere qualcosa di buon senso.

12
Nessuno dei commenti o delle risposte finora risolve la probabilità di incontrare un bug del compilatore. Assicurati di escludere prima gli errori nel tuo codice.
Dan Pichelman,

6
Risposta breve: sicuramente. Mentre IDE e compilatori sono in genere esercitati a meno di un centimetro dalla loro vita prima di vedere il mondo esterno, c'è sempre un caso angolare che uno sviluppatore un po 'troppo intelligente troverà.
KeithS

Risposte:


51

Tendi a trovarli più nelle lingue che sono attivamente sviluppate che in quelle relativamente mature (e quindi non vedono molti cambiamenti su base frequente). Questo è probabilmente il motivo per cui la maggior parte delle lingue viene rilasciata in varie 'fasi' di stabilità. Una build notturna ha molte meno probabilità di essere stabile rispetto a un candidato al rilascio , che a sua volta ha meno probabilità di essere stabile rispetto a una versione completamente rilasciata e utilizzata attivamente.

Fortunatamente la maggior parte di queste lingue (specialmente quelle che sono open source) avrà un sistema di tracciamento dei bug pubblico a cui è possibile inviare segnalazioni.

Nella mia esperienza, ho riscontrato un bug piuttosto oscuro ma grave in Scala su Windows . Ho inviato i miei risultati al bug tracker e il problema è stato risolto abbastanza rapidamente. In quel caso, gli sviluppatori del linguaggio erano abbastanza intelligenti da includere una nota utile nell'output del registro degli errori, suggerendo che ciò che avrei incontrato era in realtà un errore del compilatore e dicevano dove inviare il rapporto.


Spero non ti dispiaccia; Ho aggiunto un nuovo paragrafo (in attesa di approvazione) che pensavo potesse essere rilevante. Non solo un compilatore potrebbe contenere bug, ma potrebbe contenere codice dannoso.
Andy,

@Andy sembra che uno dei moderatori lo abbia rifiutato come qualcosa che dovrebbe essere un commento o una risposta separata.
KChaloux,

Non solo "sì", ma "inferno sì!" :-)
Hellion,

C è maturo e attivamente sviluppato. Quindi è C ++. Anche Java. ecc.
djechlin il

100

Nelle parole di laici:

Tutti i programmi possono contenere bug.

I compilatori sono programmi.

Ergo, i compilatori possono avere dei bug.


55
Ancora più preoccupante: i debugger sono programmi. Pertanto, i debugger hanno bug.
Daniel Gratzer,

19
@jozefg: Quindi come esegui il debug del debugger? Chi guarda gli osservatori?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner The watcher watchers, duh.
Jimmy Hoffa,

9
@JoelFan Da quando ho scritto "può avere", quell'eccezione è coperta. Se dici "have" devi specificare che ti riferisci solo a programmi non banali. Dicendo "può avere", non è necessario.
Tulains Córdova,

8
I programmi "Hello world" possono contenere bug se rispettati da un compilatore con errori.
wtsang02,



4

Certo, perché i compilatori sono software.

Nel 2005, ho avuto un pezzo di codice fallito in un pezzo di software altamente critico che avevo scritto per una grande azienda. Poiché costare alla società letteralmente milioni di dollari per rettificare, hanno ovviamente avviato un'indagine approfondita.

Per fortuna (dal mio punto di vista), il problema si è rivelato essere un problema del compilatore in Delphi. Nel blocco try finally, il valore restituito di una funzione è stato distrutto e ha restituito al chiamante risultati assolutamente casuali. Questo è stato documentato e riconosciuto da Borland.

.NET era noto per avere letteralmente centinaia di diverse perdite di memoria, in particolare nelle sue prime implementazioni.

Direi che non esiste software senza errori. I compilatori non fanno eccezione. Tuttavia, sono testati in modo più approfondito rispetto alla maggior parte dei software aziendali e sono consumati da persone intelligenti, critiche e controverse, quindi il loro track record è stato, nel complesso, abbastanza buono.


Esiste un software "verificato formalmente". È matematicamente dimostrato di funzionare. Occasionalmente anche il codice verificato formalmente presenta dei bug. L'implementazione di Quicksort di IIRC Java è stata verificata formalmente, ma ciò non ha tenuto conto degli overflow.
David Plumpton,

1
Qual era il software?
Dai

2

Non solo bug, ma anche malware deliberato.

Il trojan "login" implementato da Brian Kernighan nel compilatore originale di Unix C è il più noto di questi; l'articolo http://cm.bell-labs.com/who/ken/trust.html contiene alcune informazioni al riguardo.


1
È chiaro che ciò è stato effettivamente implementato?
Keith Thompson,

Questo è un argomento piuttosto interessante, ma non è affatto correlato a questa domanda.

@delnan Non sono d'accordo; al centro della domanda sembra essere "quanto posso fidarmi del mio compilatore?"
Andy,

1

Sì, certo come tutti i compilatori di software hanno dei bug, ad esempio l'elenco dei bug di gcc è qui


0

Sì.

Inoltre, non solo con compilatori, ma anche con interpreti / debugger e qualsiasi strumento software di terze parti.

Attualmente stiamo utilizzando alcuni software di terze parti e abbiamo riscontrato alcuni dei problemi. A volte ci ringraziano per aver trovato e segnalato un bug. :)

Alcuni hanno anche delle perdite di memoria, il che porta a crash. La domanda importante qui potrebbe essere: come determinare se lo strumento di terze parti o il compilatore presenta bug per il corretto funzionamento dell'applicazione?


La tua importante domanda riporterà quindi al problema di Halting
wtsang02

0

Il compilatore è un programma che legge un programma scritto in una lingua (la lingua di origine) e lo traduce in un altro programma equivalente in un'altra lingua (la lingua di destinazione), principalmente in linguaggio macchina.

Esistono diverse fasi del compilatore attraverso cui il codice della lingua sorgente viene scansionato riga per riga. C'è una tabella dei simboli che tiene traccia di tutte le parole chiave che vengono scansionate nel codice della lingua sorgente.

Fase 1: Lexical Analyzer: legge tutto il carattere nel programma sorgente e forma la separazione logica dei token (int, char, float, if-else, for, while, ecc.)

Fase 2: Syntax Analyzer: analizza la struttura del flusso di token. Analisi gerarchica di espressioni che include postfisso / prefisso ecc. (A = b + c * d)

Fase 3: Analizzatore semantico - Verifica del tipo di token (intero su reale, float ecc.) E molte cose come la precedenza dell'operatore ecc.

Fase 4: generatore di codice intermedio - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Fase 5: Ottimizzazione del codice - Varie analisi (flusso di controllo, flusso di dati, trasformazioni)
che emana: codice di ridondanza, propagazione delle costanti, codice morto parziale, sottoespressione comune, codice invariante di loop

Fase 6: generazione di codice - Generazione di codice target (principalmente linguaggio assembly) che inserisce valori nei registri

Tutte queste fasi non sono altro che programmi ben scritti e potrebbe esserci un numero N di difetti in questo ..


-1

Naturalmente, i compilatori sono solo dei programmi e anche i loro autori sono idioti :). Anche la specifica della lingua può avere un bug. Esempio: c # + foreach + lambda .

O in Python, bug nell'interprete: compilazione malefica per l'interprete in crash .

Bene, se vuoi esaminare i bug nel compilatore / interpeter -> guarda php. Esiste un bug famoso con overflow di numeri interi. La prima correzione è iniziata da if (size > INT_MAX) return NULL;. Continuazione della storia .


Gli autori di compilatori non sono idioti. Poiché i compilatori sono piuttosto complicati, anche la barriera per entrare nel campo è sostanzialmente più alta. Quindi possiamo aspettarci che le persone che le scrivono non commettano errori come fanno i ragazzi normali.
jszpilewski,

Il foreach / lambda non è un bug, si riduce a una decisione di progettazione specifica e di coscienza presa prima dell'aggiunta di lambdas.
Andy,

@Andy, come so, nessuno ha saputo quali problemi causerà questa decisione. Perché non bug?
Viktor Lova,

@jszpilewski vedi un sorriso dopo quel messaggio?
Viktor Lova,

1
Ti suggerisco di rileggere il PO, poiché la sua domanda non riguarda se le specifiche possono avere dei bug, è se i COMPILER possono avere dei bug. Poiché il compilatore C # corrispondeva alle specifiche, il compilatore non aveva un bug. Ti suggerisco anche di rileggere la tua citazione di Wikipedia "Un bug del software è un errore, un difetto, un errore o un errore in un programma per computer"
Andy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.