![]() |
1
8
好吧,甚至忽略“任何事情都有可能发生!程序可以及时返回,并在第一时间阻止自己运行!”,编译器完全有可能检测到某些形式的未定义行为,并且在这种情况下不进行编译,在这种情况下,首先就不会运行它。所以,是的,未定义的行为在原则上是有传染性的,即使在实践中大多数时候不一定如此。 |
![]() |
2
5
程序在导致未定义行为之前所做的一切当然已经完成了。
然后,我再次假设,在完成的、定义良好的操作之后执行的未定义行为可能会造成损害,以至于定义良好的行为似乎没有正确完成。我想有点像那种“如果一棵树掉在树林里……”的东西。
以下是C99标准关于在序列点之间多次修改对象值的说明:
标准中还提到了对对象的访问:
我不认为在序列点之间多次修改对象在转换时是“未定义的行为”,因为对象在转换时不被访问/修改。 即使如此,我也同意编译器在编译时诊断这种未定义的行为是件好事,但我也认为,如果把这个问题仅应用于已成功编译的程序,它会更有趣。所以让我们稍微改变一下问题,给出一个编译器在翻译时无法诊断未定义行为的情况:
所以让我们对这个程序提出同样的问题:对于第一个
如果输入提供有效的索引值,则未定义的行为只能发生
之后
第一次
|
![]() |
3
3
未定义的行为取决于编译器供应商/随机机会。这意味着它可能会抛出一个异常,破坏你程序中的数据,重写你的mp3收藏,召唤天使,或者点燃你的祖母。一旦有了未定义的行为,整个程序就变得未定义。 一些编译器和一些编译器配置会提供一些模式,这些模式会给您带来麻烦,但是一旦您启用优化,大多数程序的性能都会很差。
任何东西 可能发生。是否有什么 碰巧被 Murphy's Law :)
值得思考的是:缓冲区溢出攻击,由各种类型的恶意软件实现,严重依赖于未定义的行为。 |
![]() |
4
0
对于未定义的行为,您可能应该区分在编译时可检测的行为(如您的情况)和依赖于数据且仅在运行时发生的行为,如意外地向
必须 一直运行到UB发生,因为它通常无法预先检测到它(对于非平凡的程序来说,模型检查是一项艰巨的任务),对于您的情况,它可能被允许生成任何类型的程序,例如向编译器供应商发送一些钱;-)
一个更合理的选择是什么都不产生,也就是抛出一个错误而根本不编译。有些编译器在被告知时会这样做,例如
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 3 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 4 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 4 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 4 月前 |