You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@stdcxx.apache.org by "Martin Sebor (JIRA)" <ji...@apache.org> on 2008/12/04 22:18:44 UTC

[jira] Created: (STDCXX-1026) sgetn() fails to extract characters from an unbuffered stream

sgetn() fails to extract characters from an unbuffered stream
-------------------------------------------------------------

                 Key: STDCXX-1026
                 URL: https://issues.apache.org/jira/browse/STDCXX-1026
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 27. Input/Output
    Affects Versions: 4.2.1
            Reporter: Martin Sebor
            Assignee: Martin Sebor
             Fix For: 4.2.2


This bug was uncovered in this [discussion | http://forums.sun.com/thread.jspa?messageID=10532349]:

{noformat}
$ cat t.cpp && make t && ./t
#include <cassert>
#include <istream>
#include <streambuf>

int main ()
{
    static int x = '0';

    struct: std::streambuf {
        // unbuffered, always successfully reads one character
        int_type underflow () { return x++; }
    } sb;

    // "endless" stream that never reaches EOF
    std::istream endless (&sb);

    char s [4] = "";

    endless.read (s, sizeof s);
 
    // expect to extract as many characters as requested
    assert (endless.good ());
    assert (sizeof s == endless.gcount ());
    assert ('0' == s [0] && '1' == s [1] && '2' == s [2] && '3' == s [3]);
    
}
gcc -c -I/home/sebor/stdcxx-4.2.1/include/ansi \
       -I/home/sebor/stdcxx-4.2.1/include \
       -I/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/include \
       -I/home/sebor/stdcxx-4.2.1/examples/include \
       -pedantic -nostdinc++ -O2   -W -Wall \
       -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align   t.cpp
t.cpp: In function 'int main()':
t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
t.cpp:24: warning: called from here
t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
t.cpp:24: warning: called from here
gcc t.o -o t  -L/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib  -Wl,-R/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib -lstd8D -lsupc++ -lm 
t: t.cpp:22: int main(): Assertion `endless.good ()' failed.
Aborted
{noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Closed: (STDCXX-1026) sgetn() fails to extract characters from an unbuffered stream

Posted by "Martin Sebor (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/STDCXX-1026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Martin Sebor closed STDCXX-1026.
--------------------------------


Merged to 4.3.x in [r725458|http://svn.apache.org/viewvc?rev=725458&view=rev] and to trunk in [r725458|http://svn.apache.org/viewvc?rev=725460&view=rev].

> sgetn() fails to extract characters from an unbuffered stream
> -------------------------------------------------------------
>
>                 Key: STDCXX-1026
>                 URL: https://issues.apache.org/jira/browse/STDCXX-1026
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.2.1
>            Reporter: Martin Sebor
>            Assignee: Martin Sebor
>             Fix For: 4.2.2
>
>   Original Estimate: 2h
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> This bug was uncovered in this [discussion | http://forums.sun.com/thread.jspa?messageID=10532349]:
> {noformat}
> $ cat t.cpp && make t && ./t
> #include <cassert>
> #include <istream>
> #include <streambuf>
> int main ()
> {
>     static int x = '0';
>     struct: std::streambuf {
>         // unbuffered, always successfully reads one character
>         int_type underflow () { return x++; }
>     } sb;
>     // "endless" stream that never reaches EOF
>     std::istream endless (&sb);
>     char s [4] = "";
>     endless.read (s, sizeof s);
>  
>     // expect to extract as many characters as requested
>     assert (endless.good ());
>     assert (sizeof s == endless.gcount ());
>     assert ('0' == s [0] && '1' == s [1] && '2' == s [2] && '3' == s [3]);
>     
> }
> gcc -c -I/home/sebor/stdcxx-4.2.1/include/ansi \
>        -I/home/sebor/stdcxx-4.2.1/include \
>        -I/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/include \
>        -I/home/sebor/stdcxx-4.2.1/examples/include \
>        -pedantic -nostdinc++ -O2   -W -Wall \
>        -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align   t.cpp
> t.cpp: In function 'int main()':
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> gcc t.o -o t  -L/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib  -Wl,-R/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib -lstd8D -lsupc++ -lm 
> t: t.cpp:22: int main(): Assertion `endless.good ()' failed.
> Aborted
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (STDCXX-1026) sgetn() fails to extract characters from an unbuffered stream

Posted by "Martin Sebor (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/STDCXX-1026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12655387#action_12655387 ] 

Martin Sebor commented on STDCXX-1026:
--------------------------------------

After pondering this some more and re-reading the spec several times I'm not sure the test case is valid. I sent the question below to the C++ reflector to get a clarification. Regardless of the outcome, though, the committed fix to {{xsgetn()}} should still be fine even if the spec doesn't specify the behavior when the overridden {{underflow()}} doesn't behave exactly as required. It just makes the function more robust.

{quote}
-------- Original Message --------
Subject: difference between null and empty pending sequence
Date: Wed, 10 Dec 2008 14:23:56 -0700
From: Martin Sebor <sebor AT roguewave DOT com>
Reply-To: c++std-lib AT accu DOT org
Organization: Rogue Wave Software, Inc.
To: undisclosed-recipients:;

To: C++ libraries mailing list
Message c++std-lib-22975

I've been staring at the text for {{streambuf::underflow()}} for
so long that I've gotten myself confused enough and need help
interpreting it.

My question is this: is {{underflow()}} allowed to return non-EOF
without setting {{gptr() < egptr()}}?

I suspect what's confusing me are these two sentences (emphasis
mine):

    ??Returns??: ... If the pending sequence is *null* then
    the function returns {{traits::eof()}} to indicate failure.

and:

    The ??result character?? is:

    b) If the pending sequence is *empty* then the next
       character that would be read from the input sequence.

What is the difference between a *null* pending sequence and
one that's *empty*, and is the ??result character?? supposed
to the same as the result of the function (i.e., the return
value)?

Note that the definition of "result character" is italicized
in the text and that the only other reference to it is in
{{uflow()}} later in the same section.

Thanks
Martin
{quote}

> sgetn() fails to extract characters from an unbuffered stream
> -------------------------------------------------------------
>
>                 Key: STDCXX-1026
>                 URL: https://issues.apache.org/jira/browse/STDCXX-1026
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.2.1
>            Reporter: Martin Sebor
>            Assignee: Martin Sebor
>             Fix For: 4.2.2
>
>   Original Estimate: 2h
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> This bug was uncovered in this [discussion | http://forums.sun.com/thread.jspa?messageID=10532349]:
> {noformat}
> $ cat t.cpp && make t && ./t
> #include <cassert>
> #include <istream>
> #include <streambuf>
> int main ()
> {
>     static int x = '0';
>     struct: std::streambuf {
>         // unbuffered, always successfully reads one character
>         int_type underflow () { return x++; }
>     } sb;
>     // "endless" stream that never reaches EOF
>     std::istream endless (&sb);
>     char s [4] = "";
>     endless.read (s, sizeof s);
>  
>     // expect to extract as many characters as requested
>     assert (endless.good ());
>     assert (sizeof s == endless.gcount ());
>     assert ('0' == s [0] && '1' == s [1] && '2' == s [2] && '3' == s [3]);
>     
> }
> gcc -c -I/home/sebor/stdcxx-4.2.1/include/ansi \
>        -I/home/sebor/stdcxx-4.2.1/include \
>        -I/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/include \
>        -I/home/sebor/stdcxx-4.2.1/examples/include \
>        -pedantic -nostdinc++ -O2   -W -Wall \
>        -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align   t.cpp
> t.cpp: In function 'int main()':
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> gcc t.o -o t  -L/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib  -Wl,-R/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib -lstd8D -lsupc++ -lm 
> t: t.cpp:22: int main(): Assertion `endless.good ()' failed.
> Aborted
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (STDCXX-1026) sgetn() fails to extract characters from an unbuffered stream

Posted by "Martin Sebor (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/STDCXX-1026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Martin Sebor resolved STDCXX-1026.
----------------------------------

    Resolution: Fixed

Fixed in [r723461 | http://svn.apache.org/viewvc?rev=723461&view=rev].
Test passes. Will close after merging out to 4.3.0 and trunk.

> sgetn() fails to extract characters from an unbuffered stream
> -------------------------------------------------------------
>
>                 Key: STDCXX-1026
>                 URL: https://issues.apache.org/jira/browse/STDCXX-1026
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.2.1
>            Reporter: Martin Sebor
>            Assignee: Martin Sebor
>             Fix For: 4.2.2
>
>   Original Estimate: 2h
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> This bug was uncovered in this [discussion | http://forums.sun.com/thread.jspa?messageID=10532349]:
> {noformat}
> $ cat t.cpp && make t && ./t
> #include <cassert>
> #include <istream>
> #include <streambuf>
> int main ()
> {
>     static int x = '0';
>     struct: std::streambuf {
>         // unbuffered, always successfully reads one character
>         int_type underflow () { return x++; }
>     } sb;
>     // "endless" stream that never reaches EOF
>     std::istream endless (&sb);
>     char s [4] = "";
>     endless.read (s, sizeof s);
>  
>     // expect to extract as many characters as requested
>     assert (endless.good ());
>     assert (sizeof s == endless.gcount ());
>     assert ('0' == s [0] && '1' == s [1] && '2' == s [2] && '3' == s [3]);
>     
> }
> gcc -c -I/home/sebor/stdcxx-4.2.1/include/ansi \
>        -I/home/sebor/stdcxx-4.2.1/include \
>        -I/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/include \
>        -I/home/sebor/stdcxx-4.2.1/examples/include \
>        -pedantic -nostdinc++ -O2   -W -Wall \
>        -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align   t.cpp
> t.cpp: In function 'int main()':
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> t.cpp:9: warning: inlining failed in call to 'virtual main()::<anonymous struct>::~._26()': call is unlikely and code size would grow
> t.cpp:24: warning: called from here
> gcc t.o -o t  -L/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib  -Wl,-R/build/sebor/stdcxx-4.2.1-gcc-4.3.0-8D/lib -lstd8D -lsupc++ -lm 
> t: t.cpp:22: int main(): Assertion `endless.good ()' failed.
> Aborted
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.