Wenn man Quellcode für ein Compiler / Build-System hat, dessen Ausgabe von nichts anderem als dem Inhalt der bereitgestellten Quelldateien abhängen sollte, und wenn man mehrere andere Compiler hat und weiß, dass sie nicht alle den gleichen Compiler-Hack enthalten, kann man das Stellen Sie sicher, dass Sie eine ausführbare Datei erhalten, die von nichts anderem als dem Quellcode abhängt.
Angenommen, man hat Quellcode für ein Compiler / Linker-Paket (z. B. die Groucho Suite), der so geschrieben ist, dass seine Ausgabe weder von einem bestimmten Verhalten noch von etwas anderem als dem Inhalt der Eingabequelldateien abhängt, und man kompiliert / Verknüpft diesen Code mit einer Vielzahl von unabhängig erstellten Compilern / Linker-Paketen (z. B. der Harpo Suite, der Chico Suite und der Zeppo Suite), sodass für jedes eine andere Gruppe von ausführbaren Elementen (G-Harpo, G-Chico und G-Zeppo). Es wäre nicht unerwartet, wenn diese ausführbaren Dateien unterschiedliche Befehlsfolgen enthalten würden, sie sollten jedoch funktional identisch sein. Der Nachweis, dass sie in allen Fällen funktionsgleich sind, wäre jedoch wahrscheinlich ein unlösbares Problem.
Glücklicherweise ist ein solcher Beweis nicht erforderlich, wenn man die resultierenden ausführbaren Dateien nur für einen einzigen Zweck verwendet: das erneute Kompilieren der Groucho-Suite. Kompiliert man die Groucho-Suite mit G-Harpo (ergibt GG-Harpo), G-Chico (GG-Chico) und G-Zeppo (GG-Zeppo), so ergeben sich alle drei Dateien, GG-Harpo, GG-Chico und GG-Zeppo sollten alle Byte für Byte identisch sein. Wenn die Dateien übereinstimmen, bedeutet dies, dass alle in ihnen vorhandenen "Compiler-Viren" identisch vorhanden sein müssen (da alle drei Dateien byteweise identisch sind, können sich ihre Verhaltensweisen in keiner Weise unterscheiden Weg).
Abhängig vom Alter und der Abstammung der anderen Compiler kann möglicherweise sichergestellt werden, dass ein solcher Virus in ihnen nicht plausibel vorhanden ist. Wenn man beispielsweise einen antiken Macintosh verwendet, um einen Compiler, der 2007 von Grund auf neu geschrieben wurde, durch eine Version von MPW zu führen, die in den 1980er Jahren geschrieben wurde, wissen die Compiler der 1980er Jahre nicht, wo sie einen Virus in den 2007er Compiler einfügen sollen. Es mag heute für einen Compiler möglich sein, eine Code-Analyse so gut wie möglich durchzuführen, um dies herauszufinden, aber der für eine solche Analyse erforderliche Rechenaufwand würde den zum einfachen Kompilieren des Codes erforderlichen Rechenaufwand bei weitem überschreiten und hätte nicht unbemerkt bleiben können in einem Markt, in dem die Kompilierungsgeschwindigkeit ein Hauptverkaufsargument war.
Ich würde davon ausgehen, dass, wenn man mit Kompilierungswerkzeugen arbeitet, bei denen die Bytes in einer ausführbaren Datei, die erzeugt werden sollen, in keiner Weise von etwas anderem als dem Inhalt der eingereichten Quelldateien abhängen sollten, es möglich ist, eine einigermaßen gute Immunität von einem Thompson zu erreichen -Stil-Virus. Leider scheint aus irgendeinem Grund der Nichtdeterminismus bei der Zusammenstellung in einigen Umgebungen als normal zu gelten. Ich erkenne, dass es auf einem Multi-CPU-System möglich sein kann, dass ein Compiler schneller läuft, wenn bestimmte Aspekte der Codegenerierung variieren, je nachdem, welcher der beiden Threads zuerst eine Arbeit beendet.
Andererseits bin ich mir nicht sicher, warum Compiler / Linker keinen "kanonischen Ausgabemodus" bieten sollten, bei dem die Ausgabe nur von den Quelldateien und einem "Kompilierungsdatum" abhängt, das vom Benutzer möglicherweise überschrieben wird . Selbst wenn das Kompilieren von Code in einem solchen Modus doppelt so lange gedauert hätte wie das normale Kompilieren, würde ich vorschlagen, dass es einen erheblichen Wert hätte, in der Lage zu sein, jeden "Release-Build" Byte für Byte vollständig aus Quellmaterialien wiederherzustellen, selbst wenn dies dies bedeutete Release-Builds würden länger dauern als "normale Builds".