Boost logo

Boost Users :

Subject: [Boost-users] [String Algo] error in ireplace_first or ireplace_all with std::wstring under gcc 3.4.2 (MingW)
From: Doug Swanson (dougswanson_at_[hidden])
Date: 2010-01-15 23:20:58


I hope this is the appropriate place to post -- I apologize in advance
if it is not!

The following code compiles and runs without error under g++ in Windows,
GCC 3.4.2 (MingW):

<code>

#include <cstdio>
#include <string>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main( void )
{
    string test = "This is a test";
    ireplace_first( test, "test", "success" );
    printf( "%s\r\n", test.c_str() );
    return 0;
}

</code>

The output is correct: "This is a success".

If I change the above code to use a std::wstring instead, it will
compile, but it will crash on execution:

<code>

#include <cstdio>
#include <string>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main( void )
{
    wstring test = L"This is a test";
    ireplace_first( test, L"test", L"success" );
    printf( "%ws\r\n", test.c_str() );
    return 0;
}

</code>

Setting a breakpoint on std::terminate() in gdb gives the following
backtrace:

Breakpoint 1, 0x00407ae6 in std::terminate() ()
(gdb) bt
#0 0x00407ae6 in std::terminate() ()
#1 0x00404dc2 in __cxa_throw ()
#2 0x004021d2 in std::__throw_bad_cast() ()
#3 0x00434c69 in std::ctype<wchar_t> const&
std::use_facet<std::ctype<wchar_t> >(std::locale const&) (__loc=@0x22fe8c)
    at
C:/Applications/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/locale_facets.tcc:112
#4 0x0043415c in wchar_t std::toupper<wchar_t>(wchar_t, std::locale
const&) ( __c=84, __loc=@0x22fe8c)
    at
C:/Applications/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/locale_facets.h:4553
#5 0x0041648c in bool boost::algorithm::is_iequal::operator()<wchar_t,
wchar_t> (wchar_t const&, wchar_t const&) const (this=0x22fe8c,
Arg1=@0x3e3df4, Arg2=@0x43702e)
    at C:/Applications/Boost_new/boost/algorithm/string/compare.hpp:71
#6 0x004163fb in
boost::iterator_range<__gnu_cxx::__normal_iterator<wchar_t*,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > > >
boost::algorithm::detail::first_finderF<wchar_t const*,
boost::algorithm::is_iequal>::operator()<__gnu_cxx::__normal_iterator<wchar_t*,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > > >(__gnu_cxx::__normal_iterator<wchar_t*,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > >, __gnu_cxx::__normal_iterator<wchar_t*,
std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > >) const (this=0x22fe80, Begin={_M_current =
0x3e3df4}, End={_M_current = 0x3e3e10}) at
C:/Applications/Boost_new/boost/algorithm/string/detail/finder.hpp:76
#7 0x00413fe8 in void
boost::algorithm::find_format<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> >,
boost::algorithm::detail::first_finderF<wchar_t const*,
boost::algorithm::is_iequal>,
boost::algorithm::detail::const_formatF<boost::iterator_range<wchar_t
const*> > >(std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >&,
boost::algorithm::detail::first_finderF<wchar_t const*,
boost::algorithm::is_iequal>,
boost::algorithm::detail::const_formatF<boost::iterator_range<wchar_t
const*> >) (
    Input=@0x22ff50, Finder=@0x22fe80, Formatter={m_Format = {m_Begin =
0x43701e, m_End = 0x43702e, singular = false}})
    at C:/Applications/Boost_new/boost/algorithm/string/find_format.hpp:146
#8 0x004141b5 in void
boost::algorithm::ireplace_first<std::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t> >, wchar_t[5],
wchar_t[8]> (std::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >&, wchar_t[5] const&, wchar_t[8] const&,
std::locale const&) (Input=@0x22ff50, Search=@0x43702e,
Format=@0x43701e, Loc=@0x22ff40)
    at C:/Applications/Boost_new/boost/algorithm/string/replace.hpp:259
#9 0x004014e8 in main () at test.cpp:11

I am not competent enough with Boost to understand what the call stack
is telling me, except that __throw_bad_cast( ) is the source of the
crash. ireplace_all gives the same behavior as ireplace_first above.

Furthermore, the problem does not arise if I use replace_first or
replace_all instead of ireplace_first or ireplace_all. It compiles and
runs correctly.

Finally, the problem does not arise if I compile using MSVC 2008. It
compiles and runs correctly.

Does this indicate a problem with gcc (MingW) unicode support? Is there
an easy way to circumvent it?

Thank you very much for any suggestions!


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net