LLVM 引入了“毒物价值”的概念,我永远无法确定理解。例如,对于语句
%add = add nsw i32 %x, 1
如果%x+1
严格大于最大的 i32 整数,则将任意值分配给 %add。声称上面的陈述,即 %add = add nsw i32 %x, 1
,可以在语义上描述为:
if (%x+1) overflows then %add = undef else %add = add i32 %x,1
?
LLVM 引入了“毒物价值”的概念,我永远无法确定理解。例如,对于语句
%add = add nsw i32 %x, 1
如果%x+1
严格大于最大的 i32 整数,则将任意值分配给 %add。声称上面的陈述,即 %add = add nsw i32 %x, 1
,可以在语义上描述为:
if (%x+1) overflows then %add = undef else %add = add i32 %x,1
?
是的,它们在语义上应该是等价的。在查看可能导致未定义值的 LLVM IR 指令时,考虑 C/C++ 是很有用的。
根据 C/C++ 标准,有符号整数溢出会导致未定义的行为,Clang 通过将未定义的行为映射到有害值来进行近似。
Chris Lattner 撰写了一系列博客文章,描述了如何在 LLVM 中处理未定义的行为以及如何将其用于优化。
更新:有一个新的提议来删除 undef 并且只使用毒药。您可以在 2016 LLVM 开发者会议上在线找到有关此提案的演讲:N. Lopes “未定义行为:毒药万岁!”