This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
libstdc++/6896: ofstream, ^D and flushing
- From: Peter Schmid <schmid at snake dot iap dot physik dot tu-darmstadt dot de>
- To: gcc-gnats at gcc dot gnu dot org
- Date: Sat, 1 Jun 2002 22:00:22 +0200
- Subject: libstdc++/6896: ofstream, ^D and flushing
>Number: 6896
>Category: libstdc++
>Synopsis: ofstream, ^D and flushing
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Jun 01 13:06:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Peter Schmid
>Release: 3.1.1 20020528 (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:
When I run the testcase included in PR libstdc++/6750 and type ^D on the
keyboard I get a surprising result. The output from the binary compiled
by gcc 2.95.3 differs from the output by the binary
compiled by gcc 3.1. Maybe the result of the program run is undefined
when ^D is typed in?
>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 20020528 (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/cca2VKFy.s
GNU CPP version 3.1.1 20020528 (prerelease) (cpplib) (i386 Linux/ELF)
GNU C++ version 3.1.1 20020528 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 3.1.1 20020528 (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/ccrCA9D3.o /tmp/cca2VKFy.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/ccrCA9D3.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: cin state: 6
output state: 0
cin state: 6
output state: 0
cin state: 6
output state: 0
Enter line 2 of 3: Enter line 3 of 3: peter@kiste:~>
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: cin state: 3
output state: 0
Enter line 2 of 3: cin state: 3
output state: 0
Enter line 3 of 3: cin state: 3
output state: 0
peter@kiste:~>
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: