Hi folks,
There appears to be a bug in boost::format, an unitialized value
problem spotted when I was using valgrind on a program of mine.
The following test code illustrates the (admittedly minor?) problem:
#include
#include <iostream>
using namespace std;
int main()
{
int dummy = 5;
cout << boost::format( "%05d" ) % dummy << endl;
dummy = 0;
cout << boost::format( "%05d" ) % dummy << endl;
};
I compiled this with -g and when run with valgrind it seems that
the put_last function in feed_args.hpp sends an uninitialized value
into the standard library <<(int) operator when the integer to
be printed is 0 and leading zeros are specified. Valgrind reports
(clipped for size) on the second ::format call (but not the first)
of the test code:
==28879== Conditional jump or move depends on uninitialised value(s)
==28879== at 0x40289470: (within /usr/lib/libstdc++.so.5.0.3)
...
==28879== by 0x4028F36B: std::ostream::operator<<(int) (in
/usr/lib/libstdc++.so.5.0.3)
==28879== by 0x804CF8D: void boost::io::detail::(anonymous
namespace)::put_last(std::basic_ostream&, int&)
(feed_args.hpp:114)
==28879== by 0x804C9A2:
_ZN5boost2io6detail31_GLOBAL__N_test00Fill.cppfx7Zjb3putIcSt11char_traitsIcERiEEvT1_RKNS1_11format_itemIT_T0_EERSbIS9_SA_SaIS9_EERSt19basic_ostringstreamIS9_SA_SE_E (feed_args.hpp:176)
==28879== by 0x804BF44: void boost::io::detail::distribute(boost::basic_format&, int&) (feed_args.hpp:237)
==28879== by 0x804ABB6:
_ZN5boost2io6detail4feedIcSt11char_traitsIcERiEERNS_12basic_formatIT_T0_EESA_T1_ (feed_args.hpp:246)
==28879== by 0x804A14B: boost::basic_format& boost::basic_format::operator%<int>(int&) (format_class.hpp:69)
...
Hope this helps. Otherwise I'm enjoying using boost!
Best regards
--- Simon
--
Simon Clift E-mail: ssclift at math dot uwaterloo dot ca
Ph.D. Student
Scientific Computation Group
University of Waterloo
Waterloo, Ontario, Canada
N2L 3G1