我正在读著名的未定义的行为可能导致时间旅行发帖并注意到这部分:
首先,您可能会注意到循环中的逐一错误
控制。结果是该函数读取了超过末尾的一位
放弃之前的表数组。经典编译器不会
特别关心。它只会生成代码来读取
越界数组元素(尽管事实上这样做是
违反语言规则),如果
数组末尾的内存恰好匹配。
另一方面,后经典编译器可能会执行
以下分析:
前四次循环中,该函数可能返回 true。
当 i 为 4 时,代码执行未定义的行为。由于未定义的行为让我可以做任何我想做的事情,所以我可以完全忽略
在这种情况下,并假设 i 永远不会是 4。(如果
假设被违反,那么就会发生不可预测的事情,但是
没关系,因为未定义的行为允许我
不可预料的。)
根据这篇文章,(较新的)编译器已经可以在编译时对未定义的行为采取行动,这意味着它在某些情况下完全能够发现未定义的行为。与其让恶魔从你的鼻子里飞出来,或者通过消除 UB 代码或仅仅转换它来生成龙,因为它是允许的,为什么编译器不直接发出一个警告,表明这可能不是有意的?
编译器的工作是将高级语言的代码编译为低级语言。如果您收到描述性错误或警告消息,那么是时候感谢编译器为您做了额外的工作。为了获得所需的警告,请使用一些静态代码分析 tool.
规范中未明确定义的任何内容都是未定义的,并且不可能准备未定义行为的完整列表。对所有此类行为发出警告可能是不可能的。
实际上,在许多情况下,编译器确实会警告未定义的行为,特别是使用适当的警告标志,例如-W -Wall -Wextra -O2
关于海湾合作委员会。 (带有优化标志,例如-O2
编译器会对代码进行回归分析,并可能生成更多警告)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)