Clang++ UBSAN 报告类型 'std::_Ios_Fmtflags' 的无效值

Clang++ UBSAN reports invalid value fro type 'std::_Ios_Fmtflags'

本文关键字:无效 Fmtflags Ios std UBSAN 报告 类型 Clang++      更新时间:2023-10-16

以下代码在由clang UBSAN 编译时将崩溃

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
template<class T>
inline std::string floatToString(T i){
    printf("in floatToStringn");
    std::stringstream ss;
    ss.precision(6);
    ss << std::noshowpoint << i;
    printf("exit floatToStringn");
    return ss.str();
}
int main() {
 std::cout << floatToString(1.0) << "n";
 return 0;
}

用Clang 3.6编译:

$>clang++-3.6-fsanitize=未定义-fno消毒=浮点除以零,vptr,function-fno净化恢复-o测试.cpp

然后程序崩溃:

$>/测验在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时会出现这个问题吗?

根据http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-January/027401.html.

仍然存在于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