Opened 8 years ago

Closed 8 years ago

#3969 closed Patches (fixed)

position_to_offset() is broken for Microsoft Visual C++/Dinkumware

Reported by: gareth.sylvester-bradley@… Owned by: Daniel James
Milestone: Boost 1.43.0 Component: iostreams
Version: Boost 1.42.0 Severity: Problem
Keywords: Cc:


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.

<            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.

Attachments (0)

Change History (3)

comment:1 Changed 8 years ago by Daniel James

Owner: changed from Jonathan Turkanis to Daniel James
Status: newassigned

comment:2 Changed 8 years ago by Daniel James

(In [60581]) In position_to_offset, only cast to stream_offset after calculating _Myoff. Refs #3969.

Thanks to Garth Sylvester-Bradley.

comment:3 Changed 8 years ago by Daniel James

Resolution: fixed
Status: assignedclosed

(In [60666]) Merge iostreams.

  • Fix write_device_impl<ostream_tag>. Fixes #3839
  • Fix error checks after calling SetFilePointer?. Fixes #3953
  • Gzip filter shouldn't require its source to be peekable. Fixes #3723.
  • In position_to_offset, only cast to stream_offset after calculating _Myoff. Fixes #3969.
  • ptrdiff_t is in std. Fixes #2505.

Modify Ticket

Change Properties
Set your email in Preferences
as closed The owner will remain Daniel James.
The resolution will be deleted.

Add Comment

E-mail address and name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.