"未定义的行为"是否延伸到编译时?

HC4*_*ica 16 c c++ runtime compile-time undefined-behavior

我们都听过警告,如果你在C或C++中调用未定义的行为,任何事情都可能发生.

这是否仅限于任何运行时行为,还是包括任何编译时行为?特别是,编译器在遇到调用未定义行为的构造时,允许拒绝代码(在标准中没有其他要求的情况下这样做),甚至崩溃?

Fil*_*efp 17

" 你们都忽略了实际的定义,并专注于注释,标准没有要求. " - @ R.MartinhoFernandes

上面的消息是由给定的用户在Lounge <C++>中编写的,并且是一个非常有效的参数; 当涉及调用未定义行为的代码时,标准不会强加任何要求.


!!!

undefined-behavior甚至延伸到编译器解析输入数据(即代码)的远角,如下面C++ 11C99标准的引用所证实的那样.

用一句话回答你的问题 ;

  • 未定义的行为不仅限于运行时执行,并且允许在编译期间"以环境特征的文档化方式"崩溃1

"在环境中的记录方式的特性"是一种奇怪的说法,你可以非常写一个编译器证明它可能在任何给定的代码崩溃(这是无效),从而获得在崩溃时,它要的可能性.

1.引用C++ 11/C99标准


1.3.24 [defns.undefined]

未定义的行为 ; 本国际标准没有要求的行为

[ 注意:

当本国际标准忽略任何明确的行为定义或程序使用错误的构造或错误数据时,可能会出现未定义的行为.

允许的未定义行为包括完全忽略不可预测的结果,在翻译程序执行期间以环境特征(有或没有发出诊断消息)的特定行为, 终止翻译或执行(发布时)一条诊断信息).

许多错误的程序结构不会产生未定义的行为; 他们需要被诊断出来.

- 结束说明 ]


3.4.3 - 未定义的行为

  1. 在使用不可移植或错误的程序结构或错误数据时,此行为>国际标准不要求

  2. 注意可能的未定义行为范围包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(使用发布诊断消息).

  • "以有记录的方式特征"作为片段没有意义; 它只是"以文件化的方式表现出环境特征*"才有意义.我读过这个说,编译器的行为应该与平台上的其他程序相同; 在Unix上写入stderr,或在Windows上显示一个对话框. (3认同)

Ale*_*Dev 10

如果行为未定义,编译器可以接受它,拒绝它,发出警告,并根据标准,甚至崩溃,挂起或在您的计算机上安装病毒.

在实践中,如果你正在编写一个编译器,你应该做的目的这些事情,这并不意味着,但你可以,例如,使用哪种定义案件和事故的工作或挂在不确定的,如果性能优势证明它的算法.

仍然,一个声誉良好的编译器会避免这种情况,或者至少有一个很好的记录.

  • **-1**。这是错误的,请参阅引用标准的其他答案(例如我用 C99 和 C++11 的引号写的那个) (2认同)
  • 哪部分错了?接受它=完全忽略这种情况,拒绝它=发出诊断消息终止翻译,发出警告=接受发行等. (2认同)