stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Created: (STDCXX-250) std::operator.>(istream&, string&) fails to set failbit after it extracts 0 characters
Date Fri, 30 Jun 2006 20:46:29 GMT
std::operator.>(istream&, string&) fails to set failbit after it extracts 0 characters
--------------------------------------------------------------------------------------

         Key: STDCXX-250
         URL: http://issues.apache.org/jira/browse/STDCXX-250
     Project: C++ Standard Library
        Type: Bug

  Components: 27. Input/Output  
    Versions: 4.1.2, 4.1.3    
 Environment: all
    Reporter: Martin Sebor
    Priority: Minor


21.3.7.9, p3 says about the string extractor: "If the function extracts no characters, it
calls is.setstate(ios::failbit), which may throw ios_base::failure (27.4.4.3)." The test program
below shows that in unbuffered mode stdcxx fails to do so when an exception is thrown during
the third call to underflow().

$ cat v.cpp && make v && ./v
#include <cassert>
#include <cstdio>
#include <istream>
#include <string>

int main ()
{
    struct: std::streambuf {
        int_type underflow () {
            static int i = 0;
            // i == 0: sgect() invoked from sentry ctor
            // i == 1: sgetc() invoked from operator>>()
            // i == 2: sbumpc() invoked from operator>>()
            return 1 < i++ ? throw i : 'x';
        }
    } buf;

    std::istream is (&buf);

    std::string s;
    is >> s;

    std::printf ("state = %c%c%c, string = \"%s\" (length %u)\n",
                 is.rdstate () & is.badbit ? 'B' : '-',
                 is.rdstate () & is.eofbit ? 'E' : '-',
                 is.rdstate () & is.failbit ? 'F' : '-',
                 s.c_str (), s.size ());

    assert ("x" == s);
    assert ((is.failbit | is.badbit) == is.rdstate ());
}
gcc -c -I/build/sebor/dev/stdlib/include/ansi -D_RWSTDDEBUG   -pthreads -D_RWSTD_USE_CONFIG
-I/build/sebor/dev/stdlib/include -I/build/sebor/gcc-4.1.0-15s/include -I/build/sebor/dev/stdlib/../rwtest
-I/build/sebor/dev/stdlib/../rwtest/include -I/build/sebor/dev/stdlib/tests/include  -pedantic
-nostdinc++ -g  -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long  v.cpp
gcc v.o -o v -L/build/sebor/gcc-4.1.0-15s/rwtest -lrwtest15s -pthreads -L/build/sebor/gcc-4.1.0-15s/lib
-lstd15s  -lsupc++ -lm
state = B--, string = "x" (length 1)
Assertion failed: (is.failbit | is.badbit) == is.rdstate (), file v.cpp, line 30
Abort (core dumped)


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Mime
View raw message