This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Errors in handling of boost::asio errors ('boost' was compiled with wrong std::string representation?)


Following program:

--------------- begin of code
#include <stdio.h>
#include <boost/system/error_code.hpp>

int main()
{
std::string s = boost::system::generic_category().message(22);

    printf("size=%lu, c_str=\"%s\".\n",
            s.size(),
            s.c_str());

    return 0;
}
--------------- end of code

Give out following output:

--------------- begin of output
size=1628781863, c_str="Invalid argument".
--------------- end of output

If I try to use such string, for example:
  std::string a("");
  a += s;
program crashes.

The program was compiled from cygwin command line by following commands:

--------------- begin of commands
g++ -c test.cpp
gcc -s test.o -lstdc++ -lboost_system
--------------- end of commands

I used fresh installed cygwin with following additional packages:
  Devel / gcc-core 5.2.0-1
  Devel / gcc-g++ 5.2.0-1
  Libs / libgcc1 5.2.0-1
  Libs / libstdc++6 5.2.0-1
  Devel / make 4.1-1
  Libs / libboost-devel 1.58.0-1

Operating system: Windows XP, 32 bits, russian language
Processor: Intel Pentium 4 (3 GHz)
Version of installator: setup-x86.exe, 2.873

With libboost-devel 1.57.0-1 effect is the same.

With Windows 7, 64 bit, russian language, effect is the same (with 32-bit and with 64-bit cygwin), with the exception that another wrong values are exposed for 'size'.

When I compile boost from sources ('boost_1_59_0.7z' from boost org), the same program is running as proper:

--------------- begin of correct output
size=16, c_str="Invalid argument".
--------------- end of correct output

Constant '22' corresponds to 'boost::asio::error::invalid_argument'. Some other ASIO error codes also brings to the same effect. Aforementioned code is used in handling of exceptions from ASIO functions and brings to crashes in various unpredictable situations.

There is more real-life piece of code that produce same error:

--------------- begin of example #2
#include <stdio.h>
#include <boost/asio.hpp>

int main()
{
    boost::asio::ip::address_v4 a;
    boost::system::error_code ec;
    a.from_string("127.0.0.1111", ec);

    std::string s = ec.message();

    printf("size=%lu, c_str=\"%s\".\n",
            s.size(),
            s.c_str());

    return 0;
}
--------------- end of example #2

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]