public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* 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

* 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-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-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

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-20 13:36 libstdc++/6750: ofstream incorrectly sets failbit (severe regression) Peter Schmid
2002-05-20 14:09 paolo
2002-05-23  7:55 bkoz
2002-05-23 16:06 Peter Schmid
2002-05-27  2:36 bkoz

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).