Sind Compiler, die mit früheren Versionen von sich selbst erstellt wurden, vor Code-Injektion geschützt?

Lesezeit: 6 Minuten

Benutzer-Avatar
v.oddou

Ich habe mich gefragt, ob die heutigen modernen Compiler wie MS cc, gcc, clang, icc und neuere Versionen mit der aktuellen Version desselben Compilers erstellt wurden?

Wegen dieses Risikos natürlich:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack

Ich bin mir sicher, dass jeder, der an der Entwicklung der oben erwähnten Compiler beteiligt ist, von diesem Problem weiß, bei dem Code von einer früheren Version von ihm selbst in den Compiler eingeschleust und unsichtbar weitergegeben wird.

Nun, das eigentliche Problem ist nicht wirklich eines der Hintertüren, sondern viel mehr die Korrektheit der Codegenerierung, nicht wahr? Wie wäre es, wenn irgendwo in der Build-Kette aus reinem Versehen irgendeine perverse Wendung eingeführt wurde und der heutige Compiler aufgrund des Fehlers von Ken Thompson falschen Code generiert, selbst wenn der Quellcode des Compilers OK aussieht?

Wenn sie also mit sich selbst gebaut sind, wie schützen sie sich?

  • stackoverflow.com/questions/193560/… stackoverflow.com/questions/494372/… stackoverflow.com/questions/5657454/…

    – stijn

    27. März 2014 um 8:03 Uhr


  • @DevSolar: opinion based? Ernsthaft ? und was sagen Sie zu dem perfekt nachprüfbaren Kommentar von EJP? und warum gibst du den Implementierern keine Chance zu antworten? Es gibt Leute von Microsoft in dieser Community. Ich bin mir sicher, dass es auch GCC-Beitragende gibt.

    – v.oddou

    27. März 2014 um 8:20 Uhr


  • Möglicherweise. Was ist mit: Werden Förderbandanlagen in Fabriken mit einem Förderband gebaut? Werden Roboter aus Robotern gebaut (oder von Hand gefertigt)? Werden Computer mithilfe von Computern entworfen (oder auf Papier gezeichnet)?

    – Patrick

    27. März 2014 um 9:03 Uhr

  • Um etwas Vertrauen in den Compiler zu bekommen, würden Sie (a) ihn mit mehreren Compilern von verschiedenen Herstellern kompilieren; dies wird offensichtlich verschiedene Binärdateien erzeugen, dann (b) kompilieren Sie es mit diesen verschiedenen Binärdateien, was dann identische Binärdateien ergeben sollte. Das ist für einen Compiler, der die Sprache kompilieren kann, in der er geschrieben ist; COBOL-Compiler sind möglicherweise nicht in COBOL geschrieben.

    – gnasher729

    27. März 2014 um 9:08 Uhr


  • en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

    – phuklv

    27. März 2014 um 9:23 Uhr

Ich habe mich gefragt, ob die heutigen modernen Compiler wie MS cc, gcc, clang, icc und neuere Versionen mit der aktuellen Version desselben Compilers erstellt wurden.

Der Roslyn C#-Compiler kann sich selbst erstellen; Tatsächlich ist es einer seiner eigenen besten Testfälle. Natürlich konnte es dies nicht am ersten oder sogar am 100. Tag tun; Es wurde mit der vorherigen Version des C#-Compilers erstellt, der in C++ geschrieben wurde.

Wie wäre es, wenn irgendwo in der Build-Kette aus reinem Versehen eine perverse Wendung eingeführt wurde und der heutige Compiler falschen Code generiert, selbst wenn der Quellcode des Compilers in Ordnung aussieht

Dies ist eine ernsthafte Sorge.

Eine der interessanten Möglichkeiten, wie Sie nach Fehlern in einem selbsterstellenden Compiler suchen können, ist die folgende: Nennen Sie den ursprünglichen, nicht selbsterstellenden Compiler Alpha. Erstellen Sie den neuen Quellcode mit Alpha, um Beta zu produzieren. Lassen Sie dann Beta den Quellcode erstellen, um Gamma zu produzieren. Lassen Sie dann Gamma den Quellcode erstellen, um Delta zu produzieren. Wenn es signifikante Unterschiede in den für Gamma und Delta erstellten Binärdateien gibt, haben Sie wahrscheinlich ein Problem. Beta und Gamma sollten bei gleichen Eingaben die gleichen Ausgaben haben. (Insbesondere C# verspricht nicht, dass das zweimalige Kompilieren des gleichen Codes genau die gleiche Binärdatei erzeugt, also müssen Sie darauf achten, dass Ihr Test ausgefeilt genug ist, um dies zu berücksichtigen.)

Die Art und Weise, wie Sie dieses Risiko mindern, ist natürlich dieselbe Art und Weise, wie Sie jedes Risiko mindern, das mit schlechten Tools verbunden ist: Sie checken verschiedene Versionen der Compiler-Tools in das Repository ein, sodass Sie zu einer früheren, bekanntermaßen guten Version des Compilers zurückkehren können sollten Sie müssen. Und Sie testen den Compiler intensiv.

  • Was mich beim Bootstrap und auch beim Diverse Double Compiling verwirrt, ist, dass ich nicht ergründen kann, durch welches Wunder wir “identische Ausgabe” erhalten sollten? Da eine neue Version eines Compilers existiert, weil sie eine bessere (besser optimierte) Assemblierung generiert, würde das Kompilieren des Compilers mit unterschiedlichen Versionen oder Anbietern aufgrund unterschiedlicher Implementierungsoptionen bei der Codegenerierung unweigerlich zu unterschiedlichen Ausgaben führen. nachweisen : yosoygames.com.ar/wp/2013/12/…

    – v.oddou

    28. März 2014 um 1:07 Uhr

  • @v.oddou: Lies mein Szenario nochmal genau durch. Compiler Alpha und Beta müssen nicht die gleiche Ausgabe haben; das sind zwei verschiedene Compiler mit unterschiedlichem Quellcode und unterschiedlichem Verhalten. Aber sicherlich sollten die Compiler Beta und Gamma identisches Verhalten haben, da sie aus demselben Quellcode kompiliert wurden. Wenn die mit Alpha kompilierten Beta-Quellen und die mit Beta kompilierten Beta-Quellen Compiler mit unterschiedlichem Verhalten ergeben, dann stimmt mit Beta wahrscheinlich etwas nicht.

    – Eric Lippert

    28. März 2014 um 1:14 Uhr

  • Danke für die Hilfe 🙂 Ok, ich habe dieses Diagramm erstellt: postimg.org/image/p4lqovfwn Jetzt würde ich Ihnen zugeben, dass die binären 1 und 2 des Tests äquivalent sein sollten (modulo __TIME__ Makros Zeug), aber Orange Beta und Blue Beta wären unterschiedliche Binärdateien, und obwohl die Eingangs-/Ausgangssymmetrie respektiert werden sollte, wird die Zeit dafür benötigt Orange zu kompilieren wird anders sein als Blues aufgrund unterschiedlicher Optimierungsstufen in Alpha und Beta. Die 2 Binärdateien sind also tatsächlich sehr unterschiedlich. Ich vermisse noch etwas

    – v.oddou

    28. März 2014 um 2:01 Uhr


  • Ich glaube, ich bin auf dem Weg zu verstehen (deshalb habe ich diesmal deine Antwort akzeptiert), Gamma ist “zweitverkettet gebaut”, daher sollte es gleich sein Beta weil es nur ein Umbau ist? Ist das nachweisbar?

    – v.oddou

    23. Juli 2014 um 2:10 Uhr

Benutzer-Avatar
Benutzer207421

Im Allgemeinen lautet die Antwort „Ja“ für Compiler, die in ihren eigenen Sprachen implementiert sind. Den Compiler mit sich selbst zu bauen ist einer der besten Tests auf Korrektheit. Aufeinanderfolgende Läufe sollten weiterhin dieselbe Binärdatei produzieren. „GC“ zum Beispiel wird mit einem vierstufigen Bootstrap-Prozess erstellt.

Natürlich können einige Sprachen nicht zum Compiler-Schreiben verwendet werden.

BEARBEITEN Es sollte klargestellt werden, dass diese Antwort gepostet wurde, als die inhaltliche Frage lautete: “Werden Compiler mit früheren Versionen von sich selbst erstellt?” Es wurde nachträglich geändert.

  • “Natürlich können einige Sprachen nicht zum Compiler-Schreiben verwendet werden.” Diese Aussage ist falsch, es sei denn, wir schließen wirklich domänenspezifische Sprachen ein. Jede Turing-vollständige Sprache mit E/A kann verwendet werden, um einen Compiler für jede andere Sprache zu implementieren.

    – nibot

    27. März 2014 um 9:19 Uhr

  • @nibot In der Praxis ist das nicht so. Es ist zum Beispiel wirtschaftlich nicht machbar, einen COBOL-Compiler in COBOL zu schreiben, und nur ein Verrückter würde es versuchen. Ich nicht. Zu viele Dinge fehlen: Rekursion, für den Anfang.

    – Benutzer207421

    27. März 2014 um 9:31 Uhr


  • @nibot: Ich fordere Sie auf, einen selbsthostenden PL/SQL-Compiler oder ABAP zu schreiben… 😉 Sagen wir einfach, manche Sprachen können das nicht vernünftig für Compiler-Schreiben verwendet werden. (Obwohl ich von BF-geschriebenen BF-Compilern gehört habe und BF eine Sprache ist, die nicht mit “vernünftig” im selben Satz ohne Anführungszeichen erwähnt werden kann. 😉 )

    – DevSolar

    27. März 2014 um 10:40 Uhr


  • @nibot Sie ignorieren auch das Problem der Laufzeitbibliothek. Sie können in Cobol keine Laufzeitbibliothek für Cobol schreiben.

    – Benutzer207421

    29. März 2014 um 0:20 Uhr

1370530cookie-checkSind Compiler, die mit früheren Versionen von sich selbst erstellt wurden, vor Code-Injektion geschützt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy