为何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
相关产品推荐
相关产品推荐

