
Filipe Sousa wrote:
Hi!
I get a segmentation fault with Intel compiler 8.1 using the fallowing code
#include <boost/format.hpp> #include <iostream>
int main() { std::cout << boost::format("writing %1%, x=%2% : %3%-th try") % "toto" % 40.23 % 50 << std::endl; return 0; }
(idb) bt #0 0x0804aba8 in ctype<char>::is (this=0x41016b50, __m=2048, __c=49 '1') #at ctype_inline.h:40 #1 0x08051d55 in std::isdigit (__c=49 '1', __loc=& { ... }) at
The same code works perfectly with gcc-3.4.2 under linux. Is this a bug in boost format library or a Intel compiler problem?
The segfault takes place inside the compiler's standard library functions, so it seems like the bug is in icc. Segfaulting inside isdigit is not a conformant behaviour :) Though, that might be the result of a binary link problem, or a strange thing going on. Did you try calling std::isdigit directly, on facets constructed the way format constructs them ? the facet object is coming from those lines : #if !defined(BOOST_NO_STD_LOCALE) const std::ctype<Ch> & fac = BOOST_USE_FACET( std::ctype<Ch>, getloc()); #else io::basic_oaltstringstream<Ch, Tr, Alloc> fac; //has widen and narrow even on compilers without locale #endif (so 'fac' is in fact a stream, in case the compiler doesnt support locales. this way the workarounds needed minimal extra code.. But anyway I think icc has locales, and fac is constructed with BOOST_USE_FACET ) It might also be caused by the rest of the code fiddling some memory areas. (is this line of code causing the same bug when nothing else is executed ?) -- Samuel