LLVM 项目博客

LLVM 项目新闻和来自前线的详细信息

我的小小 LLVM:未定义行为就是魔法!


网上有很多关于编译器滥用未定义行为的 讨论还有 然后 相当多 一些 更多)关于编译器滥用未定义行为的讨论。作为回应,LLVM 编译器基础设施正在进行品牌重塑,并采用了一个新口号,以使未定义行为更友好,不易出现 损坏


品牌重塑解决了 LLVM 的“龙”标识长期存在的一个问题,实际上是一个翼龙,头部是 倒置的,这本身就是一种特殊形式的未定义行为。标识现在 显然是一匹飞马小马。


品牌重塑的另一个重大副作用是通过自动神奇地关闭所有漏洞来提高安全性,这些漏洞被使用化名为“Pinkie Pie”的黑客所利用。


这些新功能通过 -rainbow clang 选项启用,以纪念 Rainbow Dash 的单字名字。


一些例子


C++ 的内存模型指定数据竞争是未定义行为。众所周知,没有一个理智的编译器会优化原子操作,因此 LLVM 将用 LLVM 特定的 happens-to-work 关系补充标准的 happens-before 关系。在大多数架构上,这将使用微暂停原语实现,例如 x86 的 rep rep rep nop 指令。


按位宽或更大的位数进行移位现在将返回一个正态分布的随机数。这也使 rand()std::random_shuffle 过时。


bool 现在遵守 真值 的规则,以避免令人讨厌的“但如果它不是 或一?”的面试问题。此外,使用 ++ 增加 bool 现在会做正确的事情。


原子整数算术运算已指定为二进制补码。因此,常规算术运算现在也将是原子的。除了当 volatile 时,但当 volatile 原子时除外。


NaN 现在将比较相等,次正规数可以自由地将自己归类为正常/零/其他,负零将不再存在,IEEE-754 已升级到 PONY-754,浮点数仍然会 以风格化的方式舍入,并且生成信号 NaN 现在保证 不会静默,因为它等效于 putchar('\a')。顺便说一下,没有一个 math.h 会再设置 errno 了。这与未定义行为无关,但说真的,errno


类型穿透不再是事了。我们将它重命名为类型小马穿透,但它除了举办派对之外什么都不做。 谁不喜欢派对‽ 甚至安全人员也喜欢! 🎉


来自我们赞助商的一句话



当处理未定义行为时,未定义行为检测器地址检测器线程检测器—这些消毒剂是强大的工具。在您的测试中使用它们,将它们与模糊测试器结合起来,就像蛋糕上的装饰!注意:它们的运行时间并非为了安全而设计,您不应该在生产代码中使用它们!


小马标志


为了解决问题:我们保留了新 LLVM 徽标的小马标志为实现定义的。不同实例的徽标可以使用自己的小马标志来体现它们的倾向,但必须清晰地记录它们。


JF BastienMichael Spencer 发布。