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

为何std::isinf在Valgrind环境下运行时无法正常工作?

问题原因分析

你编写的C++程序如下:

test.cc:

#include <limits>
#include <iostream>
#include <cmath>
int main() {
    std::cout << (std::isinf(std::numeric_limits<long double>::infinity()) ? "true" : "false") << std::endl;
}

常规运行命令:

g++ -std=c++17 -Wall -Wextra -pedantic -O0 -g3 test.cc && ./a.out

输出true;但通过Valgrind运行:

g++ -std=c++17 -Wall -Wextra -pedantic -O0 -g3 test.cc && valgrind --leak-check=full -- ./a.out

输出false,原因如下:

  • Valgrind 3.15.0对x86平台的80-bit扩展精度浮点数(即该环境下long double的实现)支持存在缺陷。真实CPU能正确识别80-bit格式的无穷大值,但Valgrind的浮点模拟逻辑无法正确解析这种特殊值,导致std::isinf判断失败,返回false。
  • 你的环境中,Ubuntu 20.04的g++将long double映射为80-bit扩展精度类型,而Valgrind 3.15.0的模拟层没有适配这种类型的无穷大标识,因此出现了与真实运行环境不一致的结果。
  • 后续版本的Valgrind(如3.17及以上)修复了这类80-bit浮点特殊值的模拟问题,升级Valgrind版本即可解决该现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:30:43