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

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


Ich habe mich gefragt, ob die heutigen modernen Compiler wie MS cc, gcc, clang, icc, 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 eine 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?


Antworten:



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.



Dies ist ein ernstes Problem.


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 ausgeklügelt genug ist, um dies zu berücksichtigen.)


Die Art und Weise, wie Sie dieses Risiko mindern, ist natürlich die gleiche 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.