【问题标题】:Clang++ UBSAN reports invalid value fro type 'std::_Ios_Fmtflags'Clang++ UBSAN 报告类型“std::_Ios_Fmtflags”的无效值
【发布时间】:2015-09-15 11:20:54
【问题描述】:

clang UBSAN编译以下代码会崩溃

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>

template<class T>
inline std::string floatToString(T i){
    printf("in floatToString\n");
    std::stringstream ss;
    ss.precision(6);
    ss << std::noshowpoint << i;
    printf("exit floatToString\n");
    return ss.str();
}

int main() {
 std::cout << floatToString(1.0) << "\n";
 return 0;
}

使用 Clang 3.6 编译:

$> clang++-3.6 -fsanitize=undefined -fno-sanitize=float-divide-by-zero,vptr,function -fno-sanitize-recover -o test test.cpp

然后程序崩溃了:

$> ./test 在 floatToString /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/ios_base.h:96:24:运行时错误: 值 4294966271 的负载,这不是类型“std::_Ios_Fmtflags”的有效值

有人可以帮助我打开 clang UBSAN 时为什么会出现这个问题吗?

【问题讨论】:

标签: c++ clang ubsan


【解决方案1】:

根据http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-January/027401.html,这是 libstdc++ 中的一个错误。

仍然存在于 libstdc++ 5.1 中。

libc++ 按预期工作:

$ clang++ -stdlib=libc++ -fsanitize=undefined -fno-sanitize=float-divide-by-zero,vptr,function -fno-sanitize-recover -o test test.cpp -lc++abi

$ ./test
in floatToString
exit floatToString
1

【讨论】:

  • @zhanxw:我仍然收到“运行时错误”:/usr/lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/ios_base.h:102:24: runtime error: load of value 4294966271, which is not a valid value for type 'std::_Ios_Fmtflags'
  • 你使用了libc++并遇到错误吗?我尝试了你的解决方案,当使用 libc++ 而不是 libstdc++ 时它可以工作。
  • @zhanxw:不,你的“现在工作”让我觉得它已经在 libstdc++ 中修复了:-)。
  • 知道了。我应该说“你的解决方案有效”而不是“这个有效”。感谢您的跟进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2016-02-03
相关资源
最近更新 更多