Если у кого-то есть исходный код для системы компилятора / сборки, вывод которой не должен зависеть ни от чего, кроме содержимого предоставленных исходных файлов, и если у вас есть несколько других компиляторов, и он знает, что они не все содержат одинаковый хак компилятора, можно убедитесь, что вы получаете исполняемый файл, который не зависит ни от чего, кроме исходного кода.
Предположим, что у каждого есть исходный код для пакета компилятора / компоновщика (скажем, Groucho Suite), написанного таким образом, что его вывод не будет зависеть ни от каких-либо неопределенных поведений, ни от чего-либо, кроме содержимого входных исходных файлов, и один компилирует / связывает этот код с различными независимо создаваемыми пакетами компиляторов / компоновщиков (например, Harpo Suite, Chico Suite и Zeppo Suite), получая различный набор execctable для каждого (назовите их G-Harpo, G-Chico и G-Zeppo). Для этих исполняемых файлов не должно быть неожиданным, что они содержат разные последовательности инструкций, но они должны быть функционально идентичными. Однако доказать, что они функционально идентичны во всех случаях, было бы неразрешимой проблемой.
К счастью, в таком доказательстве нет необходимости, если использовать полученные исполняемые файлы только для одной цели: снова скомпилировать пакет Groucho. Если кто-то компилирует пакет Groucho, используя G-Harpo (получая GG-Harpo), G-Chico (GG-Chico) и G-Zeppo (GG-Zeppo), то все три результирующих файла, GG-Harpo, GG-Chico и GG-Zeppo, все байты должны быть идентичны. Если файлы совпадают, это будет означать, что любой «вирус компилятора», который существует в любом из них, должен существовать одинаково во всех из них (поскольку все три файла являются побайтовыми, они не могут отличаться в любом поведении. путь).
В зависимости от возраста и происхождения других компиляторов, возможно, будет возможно гарантировать, что такой вирус не может правдоподобно существовать в них. Например, если использовать старый Macintosh для загрузки компилятора, который был написан с нуля в 2007 году, через версию MPW, написанную в 1980-х годах, компиляторы 1980-х не знали бы, куда вставить вирус в компилятор 2007 года. Возможно, сегодня компилятор может выполнить достаточно сложный анализ кода, чтобы понять это, но уровень вычислений, требуемый для такого анализа, намного превысил бы уровень вычислений, необходимых для простой компиляции кода, и не мог бы остаться незамеченным на рынке, где скорость компиляции была основным пунктом продажи.
Я бы сказал, что если кто-то работает с инструментами компиляции, где байты в исполняемом файле, который должен быть создан, не должны зависеть ни от чего, кроме содержимого представленных исходных файлов, то можно добиться достаточно хорошего иммунитета от Томпсона. Вирус К сожалению, по какой-то причине недетерминизм в компиляции представляется нормальным в некоторых средах. Я признаю, что в многопроцессорной системе компилятор может работать быстрее, если ему разрешено варьировать определенные аспекты генерации кода в зависимости от того, какой из двух потоков завершает часть работы первым.
С другой стороны, я не уверен, что вижу причину, по которой компиляторы / компоновщики не должны предоставлять режим «канонического вывода», где вывод зависит только от исходных файлов и «даты компиляции», которая может быть переопределена пользователем , Даже если компиляция кода в таком режиме занимает вдвое больше времени, чем обычная компиляция, я бы предположил, что было бы весьма полезно иметь возможность воссоздать любую «релизную сборку», байт за байтом, полностью из исходных материалов, даже если это означало, что сборка релиза займет больше времени, чем «нормальная сборка».