public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: libstdc++/6750: ofstream incorrectly sets failbit (severe regression)
@ 2002-05-23 7:55 bkoz
0 siblings, 0 replies; 5+ messages in thread
From: bkoz @ 2002-05-23 7:55 UTC (permalink / raw)
To: bkoz, gcc-bugs, gcc-prs, nobody, schmid
Synopsis: ofstream incorrectly sets failbit (severe regression)
Responsible-Changed-From-To: unassigned->bkoz
Responsible-Changed-By: bkoz
Responsible-Changed-When: Thu May 23 07:55:12 2002
Responsible-Changed-Why:
Mine.
State-Changed-From-To: analyzed->feedback
State-Changed-By: bkoz
State-Changed-When: Thu May 23 07:55:12 2002
State-Changed-Why:
Peter, I appreciate this bug report. Have you looked at libstdc++/6518?
#include <iostream>
int main()
{
char* pt = NULL;
std::cout << pt << std::endl;
return 0;
}
This no longer cores, but it does set bad bit. You seem to think that setting badbit is not good. Well then, what? Throw an exception (which was suggested on the reflector list, but I think compatibility with streambuf* NULL is a better fit.) Do you agree that this is unspecified behavior?
-benjamin
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6750
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: libstdc++/6750: ofstream incorrectly sets failbit (severe regression)
@ 2002-05-27 2:36 bkoz
0 siblings, 0 replies; 5+ messages in thread
From: bkoz @ 2002-05-27 2:36 UTC (permalink / raw)
To: bkoz, gcc-bugs, gcc-prs, schmid
Synopsis: ofstream incorrectly sets failbit (severe regression)
State-Changed-From-To: feedback->closed
State-Changed-By: bkoz
State-Changed-When: Mon May 27 02:33:54 2002
State-Changed-Why:
Fixed. If you disagree, please re-open.
-benjamin
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6750
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: libstdc++/6750: ofstream incorrectly sets failbit (severe regression)
@ 2002-05-23 16:06 Peter Schmid
0 siblings, 0 replies; 5+ messages in thread
From: Peter Schmid @ 2002-05-23 16:06 UTC (permalink / raw)
To: bkoz; +Cc: gcc-prs
The following reply was made to PR libstdc++/6750; it has been noted by GNATS.
From: Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
To: <bkoz@gcc.gnu.org>, <bkoz@gcc.gnu.org>, <gcc-bugs@gcc.gnu.org>,
<gcc-prs@gcc.gnu.org>, <nobody@gcc.gnu.org>,
<schmid@snake.iap.physik.tu-darmstadt.de>, <gcc-gnats@gcc.gnu.org>
Cc:
Subject: Re: libstdc++/6750: ofstream incorrectly sets failbit (severe
regression)
Date: Fri, 24 May 2002 00:57:15 +0200 (CEST)
| This no longer cores, but it does set bad bit. You seem to think
| that setting badbit is not good. Well then, what? Throw an
| exception (which was suggested on the reflector list, but I think
| compatibility with streambuf* NULL is a better fit.) Do you agree
| that this is unspecified behavior?
Dear Benjamin,
according to my understanding of the standard, cf. clause 27.6.2.5.4,
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out,
const charT* s), etc
are only defined if s is non-null. Therefore, writing a null pointer,
in contrast to writing a zero length string (this is the scenario
described in this PR), is undefined.
I kindly ask you to revert your patch for the following reasons. First of
all, your patch breaks legal code, e.g. confer this PR and PR
libstdc++/6745 , since it does not distinguish between a NULL pointer
and a zero length string, which is wrong according to the standard.
Secondly, regardless what your are doing to avoid the core dump,
either by setting a bit or raising an exception, on
writing a null pointer, you will introduce a libstdc++ specific
extention, making user code of one of the most used facilities of the
c++ library non portable.
When I first encountered this "feature" of the iostream facility, I
assumed that the standards committee did not specify what should happen
when c is null on purpose since IMHO there is no general way of
processing a null pointer in the library. Only the writer of the
application code knows how to process and handle this border line case.
Futhermore, recently many extensions of the library were moved to
extension headers or removed completely. Therefore, I do not
understand why there is a need for your patch, implementing another
extension.
Libstdc++-v2 prints [Null] for a null pointer, but this is not a general
solution.
Finally, you are introducing an additional if clause, thus io
will be slower (maybe this is marginal, though).
Best regards,
Peter Schmid
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: libstdc++/6750: ofstream incorrectly sets failbit (severe regression)
@ 2002-05-20 14:09 paolo
0 siblings, 0 replies; 5+ messages in thread
From: paolo @ 2002-05-20 14:09 UTC (permalink / raw)
To: gcc-bugs, gcc-prs, nobody, schmid
Synopsis: ofstream incorrectly sets failbit (severe regression)
State-Changed-From-To: open->analyzed
State-Changed-By: paolo
State-Changed-When: Mon May 20 14:09:31 2002
State-Changed-Why:
Confirmed.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6750
^ permalink raw reply [flat|nested] 5+ messages in thread
* libstdc++/6750: ofstream incorrectly sets failbit (severe regression)
@ 2002-05-20 13:36 Peter Schmid
0 siblings, 0 replies; 5+ messages in thread
From: Peter Schmid @ 2002-05-20 13:36 UTC (permalink / raw)
To: gcc-gnats
>Number: 6750
>Category: libstdc++
>Synopsis: ofstream incorrectly sets failbit (severe regression)
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon May 20 13:36:00 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Peter Schmid
>Release: 3.1.1 20020519 (prerelease)
>Organization:
TU Darmstadt
>Environment:
System: Linux kiste 2.4.18 #8 Sat Mar 9 15:33:15 CET 2002 i686 unknown
Architecture: i686
SuSE 7.3
binutils 20020428
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: ../gcc/configure --enable-shared --disable-nls --enable-threads=posix --enable-languages=c,c++,f77,objc
>Description:
Today I encountered a severe regression on the branch. When I ran the
following program tio, compiled by gcc 3.1 20020519, the contents of
the file tio.dat is truncated. When I type a carriage return on the
keyboard as input for the second getline call the output
file stream sets erroneously the fail bit when written to. The
following writes are missing from the output file. This is a severe
regression from gcc 2.95.3.
I makes no difference whether the input is read from a file via file
descriptor redirection or typed on the keyboard.
>How-To-Repeat:
source code tio.C
#include <iostream>
#include <fstream>
#define OUTPUT_FILE "tio.dat"
#define BUFFSIZ 2048
int main()
{
using namespace std;
char buff[BUFFSIZ];
ofstream output(OUTPUT_FILE, ios::out);
if(!output) {
cerr << "Cannot create " << OUTPUT_FILE << endl;
exit(1);
}
cout << "Output file will be '" << OUTPUT_FILE << "'." << endl;
cout<<"rdstate before reading from cin: "
<< cin.rdstate() << endl;
cout<<"good eof fail bad "
<< ios::goodbit << " "
<< ios::eofbit << " "
<< ios::failbit << " "
<< ios::badbit << endl;
cout << "Enter line 1 of 3: ";
cin.getline(buff, BUFFSIZ);
output << buff << endl;
cerr << "cin state: " << cin.rdstate() << endl;
cerr << "output state: " << output.rdstate() << endl;
cout << "Enter line 2 of 3: ";
cin.getline(buff, BUFFSIZ);
output << buff << endl;
cerr << "cin state: " << cin.rdstate() << endl;
cerr << "output state: " << output.rdstate() << endl;
cout << "Enter line 3 of 3: ";
cin.getline(buff, BUFFSIZ);
output << buff << endl;
cerr << "cin state: " << cin.rdstate() << endl;
cerr << "output state: " << output.rdstate() << endl;
}
g++ -v -o tio tio.C -W -Wall
Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/specs
Configured with: ../gcc/configure --enable-shared --disable-nls --enable-threads=posix --enable-languages=c,c++,f77,objc
Thread model: posix
gcc version 3.1.1 20020519 (prerelease)
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/cc1plus -v -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=1 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ tio.C -D__GNUG__=3 -D__DEPRECATED -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -quiet -dumpbase tio.C -W -Wall -version -o /tmp/ccQLkRS9.s
GNU CPP version 3.1.1 20020519 (prerelease) (cpplib) (i386 Linux/ELF)
GNU C++ version 3.1.1 20020519 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 3.1.1 20020519 (prerelease).
ignoring nonexistent directory "NONE/include"
ignoring nonexistent directory "/usr/local/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include/g++-v3
/usr/local/include/g++-v3/i686-pc-linux-gnu
/usr/local/include/g++-v3/backward
/usr/local/include
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/include
/usr/include
End of search list.
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/../../../../i686-pc-linux-gnu/bin/as -V -Qy -o /tmp/ccSA70i7.o /tmp/ccQLkRS9.s
GNU assembler version 020428 (i686-pc-linux-gnu) using BFD version 020428 20020428
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o tio /usr/lib/crt1.o /usr/lib/crti.o /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/crtbegin.o -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1 -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/../../../../i686-pc-linux-gnu/lib -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/../../.. /tmp/ccSA70i7.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1.1/crtend.o /usr/lib/crtn.o
gcc 3.1
./tio
Output file will be 'tio.dat'.
rdstate before reading from cin: 0
good eof fail bad 0 2 4 1
Enter line 1 of 3: Hallo
cin state: 0
output state: 0
Enter line 2 of 3: //return key pressed
cin state: 0
output state: 1
Enter line 3 of 3: Peter!
cin state: 0
output state: 1
cat tio.dat
Hallo
gcc 2.95.3
./tio
Output file will be 'tio.dat'.
rdstate before reading from cin: 0
good eof fail bad 0 1 2 4
Enter line 1 of 3: Hallo
cin state: 0
output state: 0
Enter line 2 of 3:
cin state: 0
output state: 0
Enter line 3 of 3: Peter!
cin state: 0
output state: 0
cat tio.dat
Hallo
Peter!
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2002-05-27 9:33 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-05-23 7:55 libstdc++/6750: ofstream incorrectly sets failbit (severe regression) bkoz
-- strict thread matches above, loose matches on Subject: below --
2002-05-27 2:36 bkoz
2002-05-23 16:06 Peter Schmid
2002-05-20 14:09 paolo
2002-05-20 13:36 Peter Schmid
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).