You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC Undefined Behavior Sanitizer为何不将inf/inf判定为未定义行为?

inf/inf 场景的认知误区梳理

常见认知偏差

  • 混淆了C语言未定义行为的边界,与IEEE 754浮点的确定性运算规则
    C标准对未定义行为的覆盖范围有明确界定,整数除以零、有符号整数溢出这类整数运算属于典型的UB场景;但遵循IEEE 754规范的浮点实现中,运算产生无穷大、NaN的场景全部有确定的输出结果,根本不属于未定义行为。
    你测试代码的运算流程完全可预期:
    1. 输入值2.9e200的平方约为8.41e400,远大于双精度浮点数的最大可表示值(约1.8e308),因此square(x)的计算会触发浮点溢出,得到+inf
    2. 两个+inf相除,按照IEEE 754规则输出静默NaN,整个链路没有任何触发UB的操作
  • 对UBSan的检测范围存在误解
    -fsanitize=undefined的检测逻辑严格对照ISO C标准中明确标注为未定义行为的条款实现,不会主动拦截所有“结果看起来反常”的运算。像IEEE 754定义的inf除法、NaN生成这类有明确规则的运算,本身不在UBSan的检测目标里,运行时不报错完全符合工具的设计预期。
  • 错把整数除法的UB规则套用到浮点运算上
    不少人会把整数除法里“除以零属于UB”的经验直接平移到浮点场景,实际上两者规则差异极大:IEEE 754实现下的浮点除法,无论是非零值除以零、无穷大除以无穷大,还是零值除以零,都有固定输出,不存在语言层面的未定义行为。

补充说明

C语言里和浮点相关的未定义行为非常少,最典型的场景是浮点值向整数类型转换时,如果转换后的浮点值超出目标整数类型的可表示范围,这类操作才属于UB,会被UBSan识别。而inf/inf生成NaN的过程,完全是符合浮点标准的常规运算,不会被归类为UB。

内容的提问来源于stack exchange,提问作者zell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 09:45:04