Якщо у вас є вихідний код для системи компілятора / збірки, вихід якої не повинен залежати ні від чого іншого, ніж від вмісту наданих вихідних файлів, і якщо один має кілька інших компіляторів і знає, що не всі вони містять один і той же хакер компілятора, можна переконайтеся, що ви отримуєте виконуваний файл, який не залежить від іншого, крім вихідного коду.
Припустимо, у кожного є вихідний код для пакета компілятора / лінкера (скажімо, Groucho Suite), написаного таким чином, що його вихід не буде залежати ні від не визначеного поведінки, ні від іншого, крім вмісту вхідних вихідних файлів, і одного компіляції / посилання, що кодують на різні незалежно створені компілятори / пакети лінкерів (скажімо, Harpo Suite, Chico Suite та Zeppo Suite), даючи різний набір виконуваних для кожного (називайте їх 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 року. Сьогодні компілятору можливо зробити достатній фантазійний аналіз коду, щоб зрозуміти це, але рівень обчислень, необхідний для такого аналізу, набагато перевищив би рівень обчислень, необхідний для простого складання коду, і не міг би пройти непомітно на ринку, де швидкість компіляції була головною точкою продажу.
Я б сказав, що якщо хтось працює з інструментами компіляції, де байти у виконаному файлі, який потрібно створити, не повинні залежати ні від чого іншого, ніж від вмісту поданих вихідних файлів, можна досягти досить хорошого імунітету від Томпсона -стиль вірусу. На жаль, чомусь недетермінізм у складанні вважається нормальним у деяких середовищах. Я усвідомлюю, що в системі з декількома процесорами компілятор може працювати швидше, якщо дозволено, що певні аспекти генерації коду змінюються залежно від того, який з двох потоків закінчує роботу спочатку.
З іншого боку, я не впевнений, що я бачу будь-яку причину того, що компілятори / посилання не повинні забезпечувати режим "канонічного виводу", коли вихід залежить тільки від вихідних файлів та "дати компіляції", яку користувач може змінити . Навіть якщо компіляція коду в такому режимі зайняла вдвічі більше, ніж звичайна компіляція, я б припустив, що було б велике значення в змозі відтворити будь-яку "версію версії", байт за байтом, повністю з вихідних матеріалів, навіть якщо це означало, що Збірки версій зайнятимуть більше часу, ніж "звичайні збірки".