2015-06-29 2 views
3

Следующие коды будут врезаться, когда они составлены лязг UBSANClang ++ UBSAN сообщает недопустимое значение сюда 'станд :: _ Ios_Fmtflags' типа

#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; 
} 

Compile с Clang 3.6:

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

Тогда программа сбой:

$> ./test in floatToString /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/ios_base.h:96:24: runtime error: load of value 4294966271, which is not a valid value for type 'std::_Ios_Fmtflags'

Может кто-нибудь помочь, почему эта проблема возникает, когда я включаю clang UBSAN?

+0

См [Является ли этот код действительно не определен, так как Clang, кажется, указывает?] (Http://stackoverflow.com/q/30122500/1708801) –

ответ

0

Это ошибка в libstdC++ согласно 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 
+0

Спасибо. Это работает сейчас. – zhanxw

+0

@zhanxw: Я все еще получаю «ошибки времени выполнения»: '/usr/lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2 .0/bits/ios_base.h: 102: 24: ошибка времени выполнения: загрузка значения 4294966271, что не является допустимым значением для типа 'std :: _ Ios_Fmtflags'' – Thomas

+0

Используете ли вы libC++ и сталкиваетесь с ошибкой? Я пробовал ваше решение, и оно работало при использовании libC++ вместо libstdC++. – zhanxw