Boost logo

Boost Users :

From: Shams (shams_at_[hidden])
Date: 2007-03-29 09:30:00


Hi,

I assume you're using the current official release.
I believe the problem is already fixed in 1.34 in CVS.

Thanks
Shams

----- Original Message -----
From: "Early Ehlinger" <early_at_[hidden]>
Newsgroups: gmane.comp.lib.boost.user
To: <boost-users_at_[hidden]>
Sent: Thursday, March 29, 2007 4:46 AM
Subject: boost::format with empty string...

> Using MS Visual C++ 2005, Express Edition, the following snippet causes an
> assertion failure due to a NULL pointer in the bowels of boost::format:
>
> boost::format f( "test %1%\n" );
> f % "";
>
> I traced it down to boost/format/feed_args.hpp:
>
> template<class Ch, class Tr, class Alloc>
> void mk_str( std::basic_string<Ch,Tr, Alloc> & res,
> const Ch * beg,
> typename std::basic_string<Ch,Tr,Alloc>::size_type size,
> std::streamsize w,
> const Ch fill_char,
> std::ios_base::fmtflags f,
> const Ch prefix_space, // 0 if no space-padding
> bool center)
> // applies centered/left/right padding to the string [beg, beg+size[
> // Effects : the result is placed in res.
> {
> typedef typename std::basic_string<Ch,Tr,Alloc>::size_type
> size_type;
> res.resize(0);
> if( ( w<=0 || static_cast<size_type>(w) <=size)) {
> // no need to pad.
> res.reserve(size + !!prefix_space);
> if(prefix_space)
> res.append(1, prefix_space);
> res.append(beg, size); <<--- crashes, because beg==NULL and
> size==0
> ...
> My suggested fix looks like this:
> template<class Ch, class Tr, class Alloc>
> void mk_str( std::basic_string<Ch,Tr, Alloc> & res,
> const Ch * beg,
> typename std::basic_string<Ch,Tr,Alloc>::size_type size,
> std::streamsize w,
> const Ch fill_char,
> std::ios_base::fmtflags f,
> const Ch prefix_space, // 0 if no space-padding
> bool center)
> // applies centered/left/right padding to the string [beg, beg+size[
> // Effects : the result is placed in res.
> {
> typedef typename std::basic_string<Ch,Tr,Alloc>::size_type
> size_type;
> res.resize(0);
> if(size && ( w<=0 || static_cast<size_type>(w) <=size)) {
> // no need to pad.
> res.reserve(size + !!prefix_space);
> if(prefix_space)
> res.append(1, prefix_space);
> res.append(beg, size);
> }
> else {
> std::streamsize
> n=static_cast<std::streamsize>(w-size-!!prefix_space);
> std::streamsize n_after = 0, n_before = 0;
> res.reserve(w); // allocate once for the 2 inserts
> if(center)
> n_after = n/2, n_before = n - n_after;
> else
> if(f & std::ios_base::left)
> n_after = n;
> else
> n_before = n;
> // now make the res string :
> if(n_before) res.append(n_before, fill_char);
> if(prefix_space)
> res.append(1, prefix_space);
> if ( size )
> res.append(beg, size);
> if(n_after) res.append(n_after, fill_char);
> }
> } // -mk_str(..)
>
> -- Early Ehlinger, President, ResPower, Inc.


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