Können Compiler und Interpreten Fehler haben und was können wir (als Benutzer) tun, um mit ihnen umzugehen? [geschlossen]


28

Wenn die Arbeit eines Compilers im Wesentlichen darin besteht, Quellcode in Code auf Maschinenebene zu übersetzen, kann es dann zu Störungen in einem Compiler kommen, dh zu einer fehlerhaften "Übersetzung"?

Das Gleiche gilt für einen Dolmetscher: Kann er manchmal den erforderlichen Inhalt nicht ausgeben?

Ich habe keine Fehler in Compilern / Interpreten gehört, aber gibt es sie?


6
in der entwicklung werden sie definitiv existieren schau dir den bugtracker auf jedem open source compiler an
ratschenfreak 08.07.13

7
Ich habe keine Fehler in Compilern / Interpreten gehört, aber gibt es sie? Ich habe die Mailingliste für Bugs im GCC-
FrustratedWithFormsDesigner

47
Das ist keine wirklich gute Frage, es fragt nur nach etwas, was gesunden Menschenverstand ist.

12
Keiner der Kommentare oder Antworten spricht die Wahrscheinlichkeit an, auf einen Compiler-Fehler zu stoßen. Schließen Sie zuerst Fehler in Ihrem eigenen Code aus.
Dan Pichelman

6
Kurze Antwort: auf jeden Fall. Während IDEs und Compiler in der Regel innerhalb von einem Zentimeter ihres Lebens trainiert werden, bevor sie die Außenwelt jemals sehen, gibt es immer einen Eckfall, den ein Entwickler, der etwas zu schlau ist, finden wird.
KeithS

Antworten:


51

Ja

Sie finden sie eher in Sprachen, die aktiv entwickelt werden, als in Sprachen, die relativ ausgereift sind (und daher häufig keine großen Veränderungen feststellen ). Dies ist wahrscheinlich der Grund, warum die meisten Sprachen in verschiedenen Stabilitätsphasen veröffentlicht werden. Ein nächtlicher Build ist mit weitaus geringerer Wahrscheinlichkeit stabil als ein Release-Kandidat , der selbst mit geringerer Wahrscheinlichkeit stabiler ist als eine vollständig freigegebene und aktiv genutzte Version.

Glücklicherweise verfügen die meisten dieser Sprachen (insbesondere Open Source-Sprachen) über ein öffentliches Fehlerverfolgungssystem, bei dem Sie Berichte einreichen können.

Aus eigener Erfahrung bin ich in Scala unter Windows auf einen ziemlich dunklen, aber schweren Fehler gestoßen . Ich habe meine Ergebnisse an den Bug-Tracker übermittelt und das Problem wurde ziemlich schnell behoben. In diesem Fall waren die Sprachentwickler klug genug, um einen hilfreichen Hinweis in die Ausgabe des Fehlerprotokolls aufzunehmen. Sie schlugen vor, dass es sich bei dem, was mir begegnete, tatsächlich um einen Compilerfehler handelte, und sagten, wo der Bericht einzureichen sei.


Hoffe es macht dir nichts aus; Ich habe einen neuen Absatz (vorbehaltlich der Genehmigung) hinzugefügt, der meiner Meinung nach relevant sein könnte. Ein Compiler kann nicht nur Fehler enthalten, sondern auch bösartigen Code.
Andy

@Andy es sieht aus wie einer der Moderatoren es als etwas abgelehnt, das ein Kommentar oder eine separate Antwort sein sollte.
KChaloux

Nicht nur "Ja", sondern "Hölle ja!" :-)
Hellion

C ist sowohl ausgereift als auch aktiv entwickelt. C ++ auch. So ist Java. etc ..
Djechlin

100

Mit den Worten des Laien:

Alle Programme können Fehler enthalten.

Compiler sind Programme.

Ergo können Compiler Fehler haben.


55
Noch besorgniserregender: Debugger sind Programme. Daher haben Debugger Fehler.
Daniel Gratzer

19
@jozefg: Wie debuggen Sie den Debugger? Wer passt die Beobachter auf?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner Die Beobachter Beobachter, duh.
Jimmy Hoffa

9
@JoelFan Da ich "can have" geschrieben habe, ist diese Ausnahme abgedeckt. Wenn Sie "haben" sagen, müssen Sie angeben, dass Sie sich nur auf nicht-triviale Programme beziehen. Wenn Sie "haben können" sagen, müssen Sie das nicht.
Tulains Córdova

8
"Hello world" -Programme können Fehler aufweisen, wenn sie mit einem fehlerhaften Compiler übereinstimmen.
wtsang02



4

Natürlich, weil Compiler Software sind.

Im Jahr 2005 hatte ich einen Codefehler in einer äußerst kritischen Software, die ich für ein großes Unternehmen geschrieben hatte. Da es das Unternehmen buchstäblich Millionen von Dollar gekostet hat, haben sie natürlich eine großartige Untersuchung eingeleitet.

Zum Glück (aus meiner Sicht) erwies sich das Problem als Compiler-Problem in Delphi. Im try finally-Block wurde der Rückgabewert einer Funktion zerstört und führte zu absolut zufälligen Ergebnissen für den Aufrufer. Dies wurde von Borland dokumentiert und bestätigt.

Es ist allgemein bekannt, dass .NET buchstäblich Hunderte verschiedener Speicherverluste aufweist, insbesondere in den frühen Implementierungen.

Ich würde behaupten, dass es keine fehlerfreie Software gibt. Compiler sind keine Ausnahme. Sie werden jedoch gründlicher getestet als die meisten Unternehmenssoftwareprodukte und von intelligenten, kritischen und umstrittenen Personen konsumiert, sodass ihre Erfolgsbilanz im Großen und Ganzen ziemlich gut ist.


Es gibt eine "formal verifizierte" Software. Es ist mathematisch erwiesen, dass es funktioniert. Gelegentlich weist sogar formal überprüfter Code Fehler auf. Die QuickSort-Implementierung von IIRC Java wurde formal verifiziert, dies berücksichtigte jedoch keine Überläufe.
David Plumpton

1
Was war die Software? Komm schon :)
Komm schon

2

Nicht nur Fehler, sondern auch vorsätzliche Malware.

Der "Login" -Trojan, den Brian Kernighan für den ursprünglichen Unix C-Compiler implementiert hat, ist der bekannteste. Der Artikel http://cm.bell-labs.com/who/ken/trust.html enthält Hintergrundinformationen.


1
Ist klar, dass das tatsächlich umgesetzt wurde?
Keith Thompson

Dies ist ein sehr interessantes Thema, das jedoch in keiner Weise mit dieser Frage zu tun hat.

@delnan Ich stimme nicht zu; Der Kern der Frage scheint zu sein: "Wie viel kann ich meinem Compiler vertrauen?"
Andy

1

Ja, natürlich haben Software-Compiler Fehler, zum Beispiel ist die GCC-Fehlerliste hier


0

Ja.

Außerdem nicht nur mit Compilern, sondern auch mit Interpretern / Debuggern und allen Softwaretools von Drittanbietern.

Wir verwenden derzeit Software von Drittanbietern und haben einige Probleme. Manchmal danken sie uns, dass wir einen Fehler gefunden und gemeldet haben. :)

Einige von ihnen haben auch Speicherlecks, die zum Absturz führen. Hier könnte die wichtige Frage lauten, wie festgestellt werden kann, ob das Drittanbieter-Tool oder der Compiler Fehler aufweist, damit Ihre Anwendung ordnungsgemäß funktioniert.


Ihre wichtige Frage führt dann zurück zum Problem "Anhalten"
wtsang02 08.07.13 um 17:57

0

Compiler ist ein Programm, das ein Programm liest, das in einer Sprache (der Ausgangssprache) geschrieben ist, und es in ein anderes äquivalentes Programm in einer anderen Sprache (der Zielsprache), meistens Maschinensprache, übersetzt.

Es gibt verschiedene Phasen des Compilers, in denen der Quellcode zeilenweise gescannt wird. Es gibt eine Symboltabelle, in der alle Keywords aufgeführt sind, nach denen im Quellcode gesucht wird.

Phase 1: Lexical Analyzer - liest alle Zeichen im Quellprogramm und bildet die logische Trennung der Token (int, char, float, if-else, for, while usw.)

Phase 2: Syntax Analyzer - Analyse der Struktur von Tokenströmen. Hierarchisches Parsen von Ausdrücken, einschließlich Postfix / Präfix usw. (a = b + c * d)

Phase 3: Semantic Analyzer - Typüberprüfung von Tokens (Ganzzahl zu Real, Float usw.) und vielen Dingen wie Operator-Priorität usw.

Phase 4: Zwischencode-Generator - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Phase 5: Code-Optimierung - Verschiedene Analysen (Kontrollfluss, Datenfluss, Transformationen)
die Folgendes beinhalten: Redundanzcode, Konstanten-Propogation, Teil-Dead-Code, gemeinsamer Teilausdruck, Schleifen-Invarianten-Code

Phase 6: Codegenerierung - Generierung von Zielcode (meistens Assembler), wobei Werte in Register eingetragen werden

All diese Phasen sind nichts anderes als gut geschriebene Programme und es könnte N Fehler in der Anzahl geben.


-1

Natürlich sind Compiler nur Programme und ihre Autoren sind auch Idioten :). Sogar Sprachspezifikationen können einen Fehler aufweisen. Beispiel: c # + foreach + lambda .

Oder in Python, Fehler im Interpreter: Kompilieren des bösen Ast Crashs Interpreter .

Nun, wenn Sie nach Fehlern in Compiler / Interpeter suchen wollen -> schauen Sie sich PHP an. Es gibt einen berühmten Fehler mit Integer-Überlauf. Der erste Fix wurde von gestartet if (size > INT_MAX) return NULL;. Fortsetzung der Geschichte .


Compiler-Autoren sind keine Idioten. Da Compiler ziemlich kompliziert sind, ist auch die Barriere für den Eintritt in das Feld wesentlich höher. Wir können also davon ausgehen, dass die Leute, die sie schreiben, keine Fehler begehen, wie es normale Leute tun.
Jszpilewski

Der foreach / lambda ist kein Fehler, sondern beruht auf einer bestimmten und gewissenhaften Designentscheidung, die getroffen wurde, bevor Lambdas hinzugefügt wurden.
Andy

@Andy, wie ich weiß, hat niemand gewusst, welche Probleme diese Entscheidung verursachen wird. Warum nicht Bug?
Viktor Lova

@jszpilewski siehst du ein Lächeln nach diesem Text?
Viktor Lova

1
Ich schlage vor, Sie lesen das OP noch einmal durch, da es in seiner Frage nicht darum geht, ob Spezifikationen Fehler aufweisen können, sondern darum, ob COMPILER Fehler aufweisen können. Da der C # -Compiler der Spezifikation entsprach, hatte der Compiler keinen Fehler. Ich schlage außerdem vor, dass Sie Ihr eigenes Wikipedia-Zitat "Ein Softwarefehler ist ein Fehler, ein Fehler, ein Versagen oder ein Fehler in einem Computerprogramm" erneut lesen
Andy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.