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_offsetafter calculating_Myoff. Refs #3969.Thanks to Garth Sylvester-Bradley.