This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/53984] iostream operation throwing exception when exceptions not enabled


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53984

--- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> ---
FAIL: 27_io/basic_filebuf/overflow/char/9182-2.cc execution test

This fails because it explicitly tests for an exception:

  try
    {
      fbuf1.sputn("ison", 4);
      fbuf1.pubsync();
      VERIFY( false );
    }
  catch (std::exception&)
    {
    }


FAIL: 27_io/basic_filebuf/seekoff/wchar_t/3.cc execution test

This also fails because it explicitly tests for an exception:

  try
    {
      // seekoff should flush the output sequence, which will fail
      // if the output buffer contains illegal characters.
      fb.pubseekoff(0, ios_base::cur);
      VERIFY( false );
    }
  catch (std::exception&)
    {
    }


FAIL: 27_io/basic_filebuf/seekpos/wchar_t/1.cc execution test

This also tests for an exception:

  try
    {
      fb.pubseekpos(pos);
      VERIFY( false );
    }
  catch (std::exception&)
    {
    }



FAIL: 27_io/basic_filebuf/sync/char/9182-1.cc execution test

And again:


  try
    {
      fbuf1.sputn("onne", 4);
      fbuf1.close();
      VERIFY( false );
    }
  catch (std::exception&)
    {
    }



FAIL: 27_io/basic_filebuf/underflow/wchar_t/11544-1.cc execution test
FAIL: 27_io/basic_filebuf/underflow/wchar_t/11544-2.cc execution test

These both check for a bad stream state:

  VERIFY( in.good() );
  in.get();
  VERIFY( !in.good() );
  VERIFY( in.bad() );
  VERIFY( !in.eof() );


FAIL: 27_io/basic_filebuf/underflow/wchar_t/11603.cc execution test

This fails because we have this:

  try
    {
      wfilebuf::int_type ret = fb.pub_underflow();
      VERIFY( ret != wfilebuf::traits_type::eof() );
      fb.sbumpc();
      ret = fb.pub_underflow();
      VERIFY( ret == wfilebuf::traits_type::eof() );
    }
  catch (...)
    { }

The first VERIFY is never reached because we throw in underflow. The test seems
broken.


Several of these tests are explicitly checking for exceptions, so the current
behaviour of throwing on invalid byte sequences (comment 2) is clearly by
design.

I don't think the problem here is actually in basic_filebuf. I think filebuf is
allowed to throw if there's an I/O error. I think the problem is that
basic_istream::sentry doesn't handle exceptions that happen while skipping
whitespace:

#include <streambuf>
#include <istream>

struct SB : std::streambuf {
  int_type underflow() override { throw 1; }
};

int main()
{
  SB sb;
  std::istream is(&sb);
  int i;
  is >> i;
}

This seems easy to fix.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]