Opened 13 years ago
Closed 13 years ago
#3969 closed Patches (fixed)
position_to_offset() is broken for Microsoft Visual C++/Dinkumware
Reported by: | Owned by: | Daniel James | |
---|---|---|---|
Milestone: | Boost 1.43.0 | Component: | iostreams |
Version: | Boost 1.42.0 | Severity: | Problem |
Keywords: | Cc: |
Description
I have found a bug in position_to_offset() on Microsoft Visual C++/Dinkumware demonstrated by the following test app –
#include <iostream> #include <boost/iostreams/positioning.hpp> int main( int, char*[] ) { const boost::int64_t twoGB = 2 << 30; std::streampos pos = boost::iostreams::offset_to_position( twoGB ); pos -= 2; if ( twoGB - 2 != boost::iostreams::position_to_offset( pos ) ) { std::cout << "Failed!" << std::endl; return -1; } return 0; }
This is resolved by the following patch to boost/iostreams/positioning.hpp.
105,106c105,106 < static_cast<stream_offset>(static_cast<std::streamoff>(pos)) - < static_cast<stream_offset>(_FPOSOFF(streampos_to_fpos_t(pos))); --- > static_cast<stream_offset>(static_cast<std::streamoff>(pos) - > _FPOSOFF(streampos_to_fpos_t(pos)));
This has the potential to affect many parts of Boost.Iostreams but in particular it means the "small seeks optimization" in indirect_streambuf.hpp is broken.
Change History (3)
comment:1 by , 13 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:2 by , 13 years ago
comment:3 by , 13 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
(In [60666]) Merge iostreams.
Note:
See TracTickets
for help on using tickets.
(In [60581]) In
position_to_offset
, only cast tostream_offset
after calculating_Myoff
. Refs #3969.Thanks to Garth Sylvester-Bradley.