HC4*_*ica 16 c c++ runtime compile-time undefined-behavior
我们都听过警告,如果你在C或C++中调用未定义的行为,任何事情都可能发生.
这是否仅限于任何运行时行为,还是包括任何编译时行为?特别是,编译器在遇到调用未定义行为的构造时,允许拒绝代码(在标准中没有其他要求的情况下这样做),甚至崩溃?
Fil*_*efp 17
" 你们都忽略了实际的定义,并专注于注释,标准没有要求. " - @ R.MartinhoFernandes
上面的消息是由给定的用户在Lounge <C++>中编写的,并且是一个非常有效的参数; 当涉及调用未定义行为的代码时,标准不会强加任何要求.
undefined-behavior甚至延伸到编译器解析输入数据(即代码)的远角,如下面C++ 11和C99标准的引用所证实的那样.
用一句话回答你的问题 ;
"在环境中的记录方式的特性"是一种奇怪的说法,你可以非常写一个编译器证明它可能在任何给定的代码崩溃(这是无效),从而获得在崩溃时,它要的可能性.
1.引用C++ 11/C99标准
1.3.24 [defns.undefined]
未定义的行为 ; 本国际标准没有要求的行为
[ 注意:
当本国际标准忽略任何明确的行为定义或程序使用错误的构造或错误数据时,可能会出现未定义的行为.
允许的未定义行为包括完全忽略不可预测的结果,在翻译 或程序执行期间以环境特征(有或没有发出诊断消息)的特定行为, 终止翻译或执行(发布时)一条诊断信息).
许多错误的程序结构不会产生未定义的行为; 他们需要被诊断出来.
- 结束说明 ]
3.4.3 - 未定义的行为
在使用不可移植或错误的程序结构或错误数据时,此行为>国际标准不要求
注意可能的未定义行为范围包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或执行(使用发布诊断消息).
Ale*_*Dev 10
如果行为未定义,编译器可以接受它,拒绝它,发出警告,并根据标准,甚至崩溃,挂起或在您的计算机上安装病毒.
在实践中,如果你正在编写一个编译器,你应该做的目的这些事情,这并不意味着,但你可以,例如,使用哪种定义案件和事故的工作或挂在不确定的,如果性能优势证明它的算法.
仍然,一个声誉良好的编译器会避免这种情况,或者至少有一个很好的记录.