Подтвердить что ты не робот

Составлены ли компиляторы с предыдущей версией от ввода кода?

Мне было интересно, были ли современные современные компиляторы, такие как MS cc, gcc, clang, icc, более новые версии с текущей версией одного и того же компилятора?

Из-за этого риска:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack

Я уверен, что все, кто связан с разработкой вышеупомянутых компиляторов, знают об этой проблеме, в результате чего код вводится в компилятор более ранней версией самого себя и распространяется невидимо.

Теперь реальная проблема, на самом деле не одна из бэкдоров, но гораздо больше о правильности кода, не так ли? Как насчет того, что где-то в цепочке сборки какой-то извращенный поворот был введен чистой ошибкой, и сегодня компилятор генерирует неверный код, даже если источник компилятора выглядит ОК, из-за недостатка Кен Томпсона?

Итак, если они построены сами по себе, как они защищают себя?

4b9b3361

Ответ 1

Мне было интересно, были ли современные современные компиляторы, такие как MS cc, gcc, clang, icc, более новые версии с текущей версией одного и того же компилятора?

Компилятор Roslyn С# может сам построить; на самом деле, это один из лучших тестов. Конечно, он не мог сделать это в первый день или даже день 100; он был построен с предыдущей версией компилятора С#, который был написан на С++.

Как насчет того, что где-то в цепочке сборки какой-то извращенный поворот был введен чистой ошибкой, и сегодня компилятор генерирует неверный код, даже если источник компилятора выглядит ОК

Это серьезная проблема.

Один из интересных способов поиска ошибки в компиляторе самоорганизации заключается в следующем: вызов оригинального компилятора нестандартного построения Alpha. Создайте новый исходный код с помощью Alpha для создания Beta. Затем создайте Beta исходный код для создания Gamma. Затем Gamma построит исходный код для создания Delta. Если есть существенные различия в бинарных файлах, созданных для Gamma и Delta, у вас наверняка возникнет проблема. Бета и гамма должны иметь одинаковые выходы с одинаковыми входами. (С#, в частности, не обещает, что компиляция одного и того же кода дважды создает точно такой же двоичный файл, поэтому вы должны быть осторожны, чтобы убедиться, что ваш тест достаточно сложный, чтобы принять это во внимание.)

То, как вы смягчаете этот риск, конечно же, так же, как вы уменьшаете любой риск, связанный с плохими инструментами: вы проверяете различные версии инструментов компилятора в репозитории, чтобы вы могли вернуться к предыдущей хорошо известной версии компилятора, если вам нужно. И вы сильно тестируете компилятор.

Ответ 2

В общем случае ответ "да", для компиляторов, реализованных на их собственных языках. Построение компилятора само по себе является одним из лучших тестов для правильности. Последовательные прогоны должны продолжать производить один и тот же двоичный файл. Например, "GC" построен с четырехступенчатым процессом начальной загрузки.

Конечно, некоторые языки не могут использоваться для написания компилятора.

РЕДАКТИРОВАТЬ. Должно быть ясно, что этот ответ был опубликован, когда основной вопрос: "Являются ли компиляторы построены с предыдущей версией?" Впоследствии он был изменен.