我的小小 LLVM:未定义行为就是魔法!
网上有很多关于编译器滥用未定义行为的 讨论(还有 然后 相当多 一些 更多)关于编译器滥用未定义行为的讨论。作为回应,LLVM 编译器基础设施正在进行品牌重塑,并采用了一个新口号,以使未定义行为更友好,不易出现 损坏。
一些例子
C++ 的内存模型指定数据竞争是未定义行为。众所周知,没有一个理智的编译器会优化原子操作,因此 LLVM 将用 LLVM 特定的 happens-to-work 关系补充标准的 happens-before 关系。在大多数架构上,这将使用微暂停原语实现,例如 x86 的 rep rep rep nop 指令。
按位宽或更大的位数进行移位现在将返回一个正态分布的随机数。这也使 rand() 和 std::random_shuffle 过时。
原子整数算术运算已指定为二进制补码。因此,常规算术运算现在也将是原子的。除了当 volatile 时,但当 volatile 原子时除外。
NaN 现在将比较相等,次正规数可以自由地将自己归类为正常/零/其他,负零将不再存在,IEEE-754 已升级到 PONY-754,浮点数仍然会 以风格化的方式舍入,并且生成信号 NaN 现在保证 不会静默,因为它等效于 putchar('\a')。顺便说一下,没有一个 math.h 会再设置 errno 了。这与未定义行为无关,但说真的,errno?
类型穿透不再是事了。我们将它重命名为类型小马穿透,但它除了举办派对之外什么都不做。 谁不喜欢派对‽ 甚至安全人员也喜欢! 🎉
来自我们赞助商的一句话
当处理未定义行为时,未定义行为检测器、地址检测器和线程检测器—这些消毒剂是强大的工具。在您的测试中使用它们,将它们与模糊测试器结合起来,就像蛋糕上的装饰!注意:它们的运行时间并非为了安全而设计,您不应该在生产代码中使用它们!
小马标志
由 JF Bastien 和 Michael Spencer 发布。