c++ - 使用以前版本的编译器构建的编译器是否可以防止代码注入(inject)?

标签 c++ c compiler-construction compilation

我想知道今天的现代编译器,如 MS cc、gcc、clang、icc,是否使用相同编译器的当前版本构建了新版本?

因为当然有这个风险:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack

相信参与上述编译器开发的每个人都知道这个问题,即代码由自身的早期版本注入(inject)编译器并无形传播。

现在真正的问题不是后门,而是更多关于代码生成正确性的问题,不是吗?如果构建链中的某个地方由于纯错误而引入了一些变态扭曲,并且由于 Ken Thompson 的缺陷,即使编译器的源代码看起来不错,今天的编译器也会生成不正确的代码,该怎么办?

那么如果它们是自己 build 的,它们如何保护自己呢?

最佳答案

I was wondering if today's modern compilers like MS cc, gcc, clang, icc, newer versions were built with the current version of the same compiler?

Roslyn C# 编译器可以自行构建;事实上,它是它自己最好的测试用例之一。当然,它不能在第一天甚至第 100 天这样做;它是使用以前版本的 C# 编译器构建的,它是用 C++ 编写的。

How about if somewhere in the build chain some pervert twist was introduced by pure mistake, and today's compiler generate incorrect code, even if the compiler's source look OK

这是一个严重的问题。

在自构建编译器中查找错误的有趣方法之一如下:调用原始的非自构建编译器 Alpha。使用 Alpha 构建新的源代码以生成 Beta。然后让 Beta 构建源代码以生成 Gamma。然后让 Gamma 构建源代码以生成 Delta。如果为 Gamma 和 Delta 生成的二进制文件存在显着差异,则您可能会遇到问题。给定相同的输入,Beta 和 Gamma 应该具有相同的输出。 (特别是 C# 不保证两次编译相同的代码会产生完全相同的二进制文件,因此您必须小心确保您的测试足够复杂以考虑到这一点。)

您减轻这种风险的方式当然与减轻与不良工具相关的任何风险的方式相同:您将各种版本的编译器工具 checkin 到存储库中,以便您可以回滚到以前已知的良好版本如果你需要编译器。而且你对编译器进行了大量测试。

关于c++ - 使用以前版本的编译器构建的编译器是否可以防止代码注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681346/

相关文章:

c++ - 抛出异常类型没有限制

使用 _stscanf_s C 库函数转换成功,但实际上失败

将二进制数数组转换为十进制数

c# - 警告 : Field is never assigned to, 并将始终具有默认值 null

c++ - 编译时散列 C++0x

c++ - 检查数字是否达到阈值

c++ - 调用通用方法/将通用功能应用于具有不同类型对象的不同容器

c++ - block 注释是否旨在使用单个字符启用/禁用 block ?

regex - 莱克斯/雅克 : using global variables and finding the longest occurance

c++ - QT 在锁定线程中通过 QTest 关闭窗口