使用未定义的行为是否未定义编译器的行为?

ala*_*ain 4 c++ undefined-behavior language-lawyer

当我回答这个问题时,我写道:

首先,需要注意的是,不仅未定义用户程序的行为,而且未定义编译器的行为.

但是评论中存在分歧,所以我想在这里提出这个问题:

如果源代码包含未定义的行为,是否只是未定义的已翻译机器代码的行为,或者编译器的行为是否也未定义?

该标准定义了抽象机器的行为(1.9):

本国际标准中的语义描述定义了参数化的非确定性抽象机器.本国际标准对符合实施的结构没有要求.特别是,它们不需要复制或模拟抽象机器的结构.相反,需要符合实现来模拟(仅)抽象机器的可观察行为,如下所述.

也许问题是编译器是否是该机器的一部分,如果是,是否允许该部件以未定义的方式运行?


这个问题的一个更实际的版本是:
假设编译器在所有控制路径上找到UB时会崩溃或不产生任何输出,就像在这个程序中一样:

int main() {
    complex_things_without_UB();
    int x = 42;
    x = x++;  //UB here
    return x;
}
Run Code Online (Sandbox Code Playgroud)

但否则它将始终产生正确的二进制文件.这仍然是符合标准的编译器吗?

Bar*_*rry 6

C++标准定义了代码的行为,它没有定义编译器的行为.因此,引用编译器的未定义行为并没有多大意义 - 从一开始就没有明确定义.唯一的要求是它产生符合代码标准指南的实现.它是如何实现的.