#7873 closed Bugs (fixed)
C4244 in basic_binary_iprimitive.hpp due to std::size_t and std::streamsize type difference
| Reported by: | Owned by: | Robert Ramey | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | serialization |
| Version: | Boost 1.50.0 | Severity: | Cosmetic |
| Keywords: | Cc: |
Description
With Visual Studio 2010 a C4244 warning appears in basic_binary_iprimitive.hpp.
boost/archive/basic_binary_iprimitive.hpp(181): warning C4244: 'argument' : conversion from 'std::streamsize' to 'size_t', possible loss of data
The offending line is the last one in the function, with (count - s)
template<class Archive, class Elem, class Tr>
inline void
basic_binary_iprimitive<Archive, Elem, Tr>::load_binary(
void *address,
std::size_t count
){
// note: an optimizer should eliminate the following for char files
BOOST_ASSERT(
static_cast<std::streamsize>(count / sizeof(Elem))
<= boost::integer_traits<std::streamsize>::const_max
);
std::streamsize s = static_cast<std::streamsize>(count / sizeof(Elem));
std::streamsize scount = m_sb.sgetn(
static_cast<Elem *>(address),
s
);
if(scount != s)
boost::serialization::throw_exception(
archive_exception(archive_exception::input_stream_error)
);
// note: an optimizer should eliminate the following for char files
BOOST_ASSERT(count % sizeof(Elem) <= boost::integer_traits<std::streamsize>::const_max);
s = static_cast<std::streamsize>(count % sizeof(Elem));
if(0 < s){
// if(is.fail())
// boost::serialization::throw_exception(
// archive_exception(archive_exception::stream_error)
// );
Elem t;
scount = m_sb.sgetn(& t, 1);
if(scount != 1)
boost::serialization::throw_exception(
archive_exception(archive_exception::input_stream_error)
);
std::memcpy(static_cast<char*>(address) + (count - s), &t, s);
}
}
where count is a passed-in std::size_t and s is a local std::streamsize.
Ticket #3755 discusses a related issue in the asserts where a signed/unsigned comparison took place. This was resolved by a static_cast in the assert.
For Visual Studio 2010, x86, and both Release and Debug, the following effective typedefs apply
typedef __int64 streamsize; typedef _unsigned int size_t;
Since s is set by count, there does not seen to be a risk of overflowing s. Is there any way to prevent the warning?
I check the current trunk and the issue would still exist.
Change History (4)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
comment:3 by , 10 years ago
An easy "fix" for this if you don't have a fixed version of boost:
Just ignore the warnings in the specific files.
#pragma warning (push)
#pragma warning( disable : 4244 )
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#pragma warning (pop)

I'm also experiencing this. Really annoying warning!