Boost Users :
From: Mick Hollins (mick_at_[hidden])
Date: 2005-11-28 06:34:41
The following code causes a runtime assertion in VC 8.0:
std::string l_str = (boost::format("here is an empty string: %1%") % l_param).str();
It passes an empty string argument to boost::format.
The assert is inside the implementation of basic_string::append()
and boils down to the fact that the implementation of boost::format ends up calling
basic_string::append(const char *, size_type) with a null pointer, which causes
basic_string::append to assert.
The following sample code causes the same assertion without boost::format being involved:
const char *l_null = NULL;
std::string::size_type l_size = 0;
l_str.append(l_null, l_size); // causes an assert
I have currently disabled the assertion by calling the following code before I do
#if _MSC_VER >= 1400
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
which causes the asserts to simply emit a message to stderr rather than to pop
up a message box, but I don't really want to disable VC 8.0's assertions across the board.
My questions are:
1) Is this considered to be a bug in boost::format or a case of VC 8.0's runtime checks
being overzealous? Personally I feel that calling append(null, 0) should be allowed
and VC 8.0 is being too protective, but the copy of the C++ standard I have suggests
that VC 8.0 is correct.
2) Either way, what do people think is the best way forward?
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