[gnu.g++.lib.bug] Bug report for GNU Libg++ 1.35.1 on i386

root@UCDAVIS.EDU (08/05/89)

Bug report for GNU Libg++ 1.35.1

Machine: Cubix QB3/386
OS:	 System V/386 Release 3.2 (Cubix Id: 386-3/A/0)
Config:	 g++-1.35.1-, config-g++ i386v (with my COFF patches)
	 libg++-1.35.1, with certain System V and i386 patches
                        (available on request)
Problem: New streams implementation causes a bus error and dumps core.
         Here is relevant information:
	 (I apologize for the assembly level debugging; -g isn't implemented
	 for COFF yet, and -g0 is pretty sickly.)

# make
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  builtin.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  File.cc
/usr/include/sys/fcntl.h:65: warning: type declaration of flock shadows previous declaration
/usr/include/sys/fcntl.h:65: warning: `flock' was declared `extern' and later `static'
In method struct File *File::File (int, char *, enum io_mode):
File.cc:262: warning: assignment of unsigned pointer from signed pointer
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  stream.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  streambuf.cc
/usr/include/sys/fcntl.h:65: warning: type declaration of flock shadows previous declaration
/usr/include/sys/fcntl.h:65: warning: `flock' was declared `extern' and later `static'
In method void Filebuf::init_streambuf_ptrs ():
streambuf.cc:233: warning: assignment of signed pointer from unsigned pointer
In method int Filebuf::underflow ():
streambuf.cc:352: warning: assignment of signed pointer from unsigned pointer
streambuf.cc:361: warning: assignment of unsigned pointer from signed pointer
In method int Filebuf::overflow (int (=  -1 )):
streambuf.cc:390: warning: assignment of signed pointer from unsigned pointer
streambuf.cc:401: warning: assignment of unsigned pointer from signed pointer
streambuf.cc:408: warning: assignment of signed pointer from unsigned pointer
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  PlotFile.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  SFile.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Obstack.cc
	gcc -g -O -I../g++-include -DUSG -c regex.c
regex.c: In function re_search_2:
regex.c:1069: warning: argument passing between incompatible pointer types
regex.c:1069: warning: argument passing between incompatible pointer types
regex.c: In function re_match:
regex.c:1096: warning: argument passing between incompatible pointer types
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  String.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Integer.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Rational.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Complex.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  BitSet.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  BitString.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Random.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  RNG.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  ACG.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  MLCG.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Sample.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Fix.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Fix16.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  Fix24.cc
	g++ -O -fchar-charconst -I../g++-include -I.. -fstrength-reduce -fsave-memoized -fno-defer-pop -c  CursesWindow.c
In method int CursesWindow::scanw (const char *, ...):
CursesWindow.c:48: warning: assignment of unsigned pointer from signed pointer
In method int CursesWindow::mvscanw (int, int, const char *, ...):
CursesWindow.c:64: warning: assignment of unsigned pointer from signed pointer
	ar r libg++.a builtin.o File.o  stream.o streambuf.o PlotFile.o  SFile.o  Obstack.o  regex.o String.o  Integer.o Rational.o Complex.o  BitSet.o BitString.o Random.o  RNG.o ACG.o MLCG.o Sample.o  Fix.o Fix16.o Fix24.o CursesWindow.o
ar: creating libg++.a
# cp libg++.a /lib
# cd ../tests
# make tFile
	g++ -g0 -O -fchar-charconst -I../g++-include -I. -fstrength-reduce -fno-defer-pop -c  tFile.cc
	g++ tFile.o  -o tFile
# ./tFile
Bus error - core dumped
# gdb tFile core
GDB 3.2, Copyright (C) 1988 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /usr/spool/uucppublic/libg++-1.35.1/tests/tFile...done.
Type "help" for a list of commands.
(gdb) bt
#0  0x6f76 in sputs_PSstreambuf_PQI ()
#1  0x5bb in t1 () (tFile.cc line 32)
#2  0x3fd2 in main (Error reading memory address 0x24d2196d: Not owner (1).
(gdb) x/i $pc
0x6f76 <sputs_PSstreambuf_PQI+74>:	movb   %cl,(%edx)
(gdb) asdump
Dump of assembler code from 0x6f2c to 0x6f8c:
0x6f2c <sputs_PSstreambuf_PQI>:	pushl  %ebp
0x6f2d <sputs_PSstreambuf_PQI+1>:	movl   %esp,%ebp
0x6f2f <sputs_PSstreambuf_PQI+3>:	pushl  %edi
0x6f30 <sputs_PSstreambuf_PQI+4>:	pushl  %esi
0x6f31 <sputs_PSstreambuf_PQI+5>:	pushl  %ebx
0x6f32 <sputs_PSstreambuf_PQI+6>:	movl   8(%ebp),%edi
0x6f35 <sputs_PSstreambuf_PQI+9>:	movl   12(%ebp),%ebx
0x6f38 <sputs_PSstreambuf_PQI+12>:	testl  %ebx,%ebx
0x6f3a <sputs_PSstreambuf_PQI+14>:	je     0x6f80
0x6f3c <sputs_PSstreambuf_PQI+16>:	cmpb   $0x0,(%ebx)
0x6f3f <sputs_PSstreambuf_PQI+19>:	je     0x6f80
0x6f41 <sputs_PSstreambuf_PQI+21>:	leal   4(%edi),%esi
0x6f44 <sputs_PSstreambuf_PQI+24>:	movl   12(%edi),%ecx
0x6f47 <sputs_PSstreambuf_PQI+27>:	cmpl   4(%edi),%ecx
0x6f4a <sputs_PSstreambuf_PQI+30>:	ja     0x6f72
0x6f4c <sputs_PSstreambuf_PQI+32>:	movl   20(%edi),%eax
0x6f4f <sputs_PSstreambuf_PQI+35>:	movsbl (%ebx),%edx
0x6f52 <sputs_PSstreambuf_PQI+38>:	pushl  %edx
0x6f53 <sputs_PSstreambuf_PQI+39>:	movswl 16(%eax),%edx
0x6f57 <sputs_PSstreambuf_PQI+43>:	leal   (%edx,%edi,1),%edx
0x6f5a <sputs_PSstreambuf_PQI+46>:	pushl  %edx
0x6f5b <sputs_PSstreambuf_PQI+47>:	movl   20(%eax),%eax
0x6f5e <sputs_PSstreambuf_PQI+50>:	call   *%eax
0x6f60 <sputs_PSstreambuf_PQI+52>:	leal   8(%esp,1),%esp
0x6f64 <sputs_PSstreambuf_PQI+56>:	movl   %eax,%edx
0x6f66 <sputs_PSstreambuf_PQI+58>:	cmpl   $0xffffffff,%edx
0x6f69 <sputs_PSstreambuf_PQI+61>:	jne    0x6f7a
0x6f6b <sputs_PSstreambuf_PQI+63>:	movl   $0xffffffff,%eax
0x6f70 <sputs_PSstreambuf_PQI+68>:	jmp    0x6f82
0x6f72 <sputs_PSstreambuf_PQI+70>:	movl   (%esi),%edx
0x6f74 <sputs_PSstreambuf_PQI+72>:	movb   (%ebx),%cl
0x6f76 <sputs_PSstreambuf_PQI+74>:	movb   %cl,(%edx)
0x6f78 <sputs_PSstreambuf_PQI+76>:	incl   (%esi)
0x6f7a <sputs_PSstreambuf_PQI+78>:	incl   %ebx
0x6f7b <sputs_PSstreambuf_PQI+79>:	cmpb   $0x0,(%ebx)
0x6f7e <sputs_PSstreambuf_PQI+82>:	jne    0x6f44
0x6f80 <sputs_PSstreambuf_PQI+84>:	xorl   %eax,%eax
0x6f82 <sputs_PSstreambuf_PQI+86>:	leal   -12(%ebp),%esp
0x6f85 <sputs_PSstreambuf_PQI+89>:	popl   %ebx
0x6f86 <sputs_PSstreambuf_PQI+90>:	popl   %esi
0x6f87 <sputs_PSstreambuf_PQI+91>:	popl   %edi
0x6f88 <sputs_PSstreambuf_PQI+92>:	leave  
0x6f89 <sputs_PSstreambuf_PQI+93>:	ret    
0x6f8a <sputs_PSstreambuf_PQI+94>:	nop    
0x6f8b <sputs_PSstreambuf_PQI+95>:	nop    
End of assembler dump.
(gdb) q

Here is the source merged with the assembler output.  Make of it what
you will.  I am no 80386 assembler expert, but my first impression is
that *pptr isn't pointing to the right thing when the instruction
movb %cl,(%edx) [in the statement: *pptr++ = *s] is executed.

#int streambuf::sputs(const char* s)
.globl sputs_PSstreambuf_PQI
sputs_PSstreambuf_PQI:
#{
	pushl %ebp
	movl %esp,%ebp
	pushl %edi
	pushl %esi
	pushl %ebx
	movl 8(%ebp),%edi
	movl 12(%ebp),%ebx
#  if (s != 0 )
	testl %ebx,%ebx
	je .L422
#  {
#    for(; *s != 0; ++s)
	cmpb $0,(%ebx)
	je .L422
	leal 4(%edi),%esi
.L429:
#    {
#       if (pptr < eptr) *pptr++ = *s;
	movl 12(%edi),%ecx
	cmpl 4(%edi),%ecx
	ja .L426
#      else if (overflow(*s) == EOF) return EOF;
	movl 20(%edi),%eax
	movsbl (%ebx),%edx
	pushl %edx
	movswl 16(%eax),%edx
	leal (%edx,%edi),%edx
	pushl %edx
	movl 20(%eax),%eax
	call *%eax
	leal 8(%esp),%esp
	movl %eax,%edx
	cmpl $-1,%edx
	jne .L425
	movl $-1,%eax
	jmp .L421
.L426:
	movl (%esi),%edx
	movb (%ebx),%cl
	movb %cl,(%edx)
	incl (%esi)
#    }
#  }
.L425:
	incl %ebx
	cmpb $0,(%ebx)
	jne .L429
.L422:
#  return 0;
	xorl %eax,%eax
#}
.L421:
	leal -12(%ebp),%esp
	popl %ebx
	popl %esi
	popl %edi
	leave
	ret

--
Ronald Cole               | uucp:     cvms!ronald       voice: +1 916 895 8321
Senior Software Engineer  | internet: csusac!cvms!ronald@ucdavis.edu
CVM Systems               +----------------------------------------------------
"SCCS, the source motel! Programs check in and never check out!" - Ken Thompson