可以保证UB在编译时被拒绝吗?

M.M*_*M.M 7 c c++ undefined-behavior language-lawyer

考虑这个程序:

#include <stdio.h>

int main(void)
{
    int x;
    while ( 1 == scanf("%d", &x) )
        printf("%c\n", "hello"[x]);
}
Run Code Online (Sandbox Code Playgroud)

编译器必须成功编译,因为程序没有UB,只要用户不输入范围之外的任何数字0- 4.

但是,根据这个线程, UB可以及时返回.现在考虑这个程序:

int main(void)
{ 
    printf("hello\n");
    "hello"[6];
}
Run Code Online (Sandbox Code Playgroud)

对此程序的任何调用都会导致未定义的行为,并且因为这可能是时间旅行,所以此程序在任何调用中的整个行为都是未定义的.因此,编译器可以拒绝该程序而不生成可执行文件吗?(我们可能会说UB回到编译阶段!)

Jon*_*ely 14

因此,编译器可以拒绝该程序而不生成可执行文件吗?

是.未定义行为的定义是:

本国际标准没有要求的 行为[注意:当本国际标准忽略任何明确的行为定义或程序使用错误的结构或错误数据时,可能会出现未定义的行为.允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的特定行为,终止翻译或执行(发布时)一条诊断信息).许多错误的程序结构不会产生未定义的行为; 他们需要被诊断出来. - 结束说明]