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] Commented: (STDCXX-250) std::operator>>(istream&, string&) fails to set failbit after it extracts 0 characters
Date Wed, 28 Nov 2007 21:54:43 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-250?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12546422
] 

Martin Sebor commented on STDCXX-250:
-------------------------------------

gptr() may stay null in unbuffered mode so I don't think "extracted" necessarily implies incrementing
gptr(). To extract a character from a sequence means to advance to the next position in the
sequence so that the subsequent extraction will return the character at the next position
(or EOF).

> std::operator>>(istream&, string&) fails to set failbit after it extracts
0 characters
> --------------------------------------------------------------------------------------
>
>                 Key: STDCXX-250
>                 URL: https://issues.apache.org/jira/browse/STDCXX-250
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.1.2, 4.1.3
>         Environment: all
>            Reporter: Martin Sebor
>            Assignee: Farid Zaripov
>            Priority: Minor
>             Fix For: 4.2.1
>
>         Attachments: istream.cc.diff
>
>
> 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.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message