schmidt@zola.ics.uci.edu (Doug Schmidt) (08/22/89)
In article <8908211701.AA23169@Neon.Stanford.EDU>, robert@NEON (James R. Kennedy) writes: >The following illustrates two bugs in g++ version 1.36.0- (version as >of 2:33 AM PDT, Monday 21 Aug). Sun4, SunOS 4.0. > >Bug 1: Variable-length array parameters broken (see p. 46 of manual). >Bug 2: Segmentation violation rears its ugly head again. > >------------------ begin winge.cc ----------------------- >#include <stream.h> > >void gripe(char c[a], int a) > >{ >cout << c[0]; >} > > >main() > >{ >gripe("T", 2); >} >------------------- end winge.cc ------------------------- Several points: 1. Even if variable-length array parameters *did* work in G++, you've incorrectly used them in function `gripe'. Variable length array parameters are actually a GCC extension, and your example would need to be re-written as: void gripe(int a, char c[a]) { /* ... */ } to work there. Note that you must declare the `a' BEFORE trying to use it as the size-specifier in GCC. If you think about how this is parsed (i.e., left-to-right) the semantics make sense. 2. This extension does not yet work with G++. Upon reflection, you'll probably see the dilemma facing C++ (that does *not* face GCC). The problem is default parameters. For example, consider the following cases: const int a = 10; /* Should print 10, regardless of what the value of the actual parameter for the first argument is, since default parameters ignore other names in the parameter list. */ void gripe1 (int a, int j = a) { printf ("%d\n", j); } /* b[a] is a 10 character array of char, independent of what int a is! */ void gripe2 (int a, char b[a]); So the problem with supporting that GCC extension in G++ is that can't necessarily throw parameters names into the symbol table while parsing the formal parameter list, since you might end up hiding global names that should be used according to the C++ default parameter semantics. If anyone sees a clean way around this that supports both the C++ semantics and the GCC extension semantics I'd like to hear it! 3. The g++ manual is incorrect, I'll make that change. Doug -- Master Swordsman speak of humility; | schmidt@ics.uci.edu (ARPA) Philosophers speak of truth; | office: (714) 856-4034 Saints and wisemen speak of the Tao of no doubt; The moon, sun, and sea speaks for itself. -- Hiroshi Hamada
sysdoc@boingo.med.jhu.edu (The Doctor) (01/24/90)
There seems to be a bug in the g++ compiler when the compiler flag -fthis-is-variable is given. The bug seems to be that the compiler does not alloca() memory for the object prior to some of the constructor call executing when the "new" operator is used. Although I realize that -fthis-is-vairable is discouraged flag, I have been trying to compile the OOPS smalltalk like object library that was originally designed for AT&T C++. The object file i/o really requires using "this" as a variable. Following is code that breaks: -------------------------------------------------------------- /* * a few more tests for streams * */ #include <stream.h> #include <SFile.h> #include <PlotFile.h> #include <std.h> #include <assert.h> #include <sys/file.h> void t1() { ostream* sout = new ostream(creat("/tmp/tStream.out", 0664)); *sout << "Hello from the stream testor\n"; delete sout; istream* sin = new istream(open("/tmp/tStream.out", O_RDONLY)); char ch; while(*sin >> ch) cout << ch; delete sin; } main() { t1(); cout << "\nFinal names & states:\n"; cout << "cin: " << cin.name() << "\t" << cin.rdstate() << "\n"; cout << "cout: " << cout.name() << "\t" << cout.rdstate() << "\n"; cout << "cerr: " << cerr.name() << "\t" << cerr.rdstate() << "\n"; cout << "\nend of test.\n"; } -------------------------------------------------------------- This code produces a segmentation fault when run after compilation with the -fthis-is-variable. Following is a gdb run showing the location of the fault: -------------------------------------------------------------- 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 /data/usr/local/src/libg++/tests/tStream...done. Type "help" for a list of commands. (gdb) dir ../src Source directories searched: /data/usr/local/src/libg++/tests:/data/usr/local/src/libg++/tests/../src (gdb) run Starting program: /data/usr/local/src/libg++/tests/tStream Program received signal 11, Segmentation fault Reading in symbols for stream.cc...done. 0x293c in __7ostreami ($this=(ostream *) 0x0, filedesc=3) (stream.cc line 78) 78 : state(_good), ownbuf(1) (gdb) list 73 { 74 bp = new Filebuf(fileptr); 75 } 76 77 ostream::ostream(int filedesc) 78 : state(_good), ownbuf(1) 79 { 80 bp = new filebuf(filedesc); 81 } 82 (gdb) print this $1 = (ostream *) 0x0 (gdb) up Reading in symbols for tStream.cc...done. #1 0x20e0 in t1__Fv () (tStream.cc line 15) 15 ostream* sout = new ostream(creat("/tmp/tStream.out", 0664)); (gdb) list 10 #include <assert.h> 11 #include <sys/file.h> 12 13 void t1() 14 { 15 ostream* sout = new ostream(creat("/tmp/tStream.out", 0664)); 16 17 *sout << "Hello from the stream testor\n"; 18 delete sout; 19 (gdb) -------------------------------------------------------------- Following is the compilation process which resulted in the above gdb session. This was compiled and run on a Sun 4/280 running Sun OS v3.2 BSD Unix. The error was also observed on a Sun 3/160 running Sun OS v3.5 BSD Unix. -------------------------------------------------------------- g++ -I../g++-include -g -O -fstrength-reduce -felide-constructors -fschedule-insns -fdelayed-branch -fsave-memoized -fthis-is-variable -Wall -v -pipe -c tStream.cc gcc version 1.36.1 (based on GCC 1.36) /usr/local/bin/lib/gcc-cpp -+ -v -I../g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__OPTIMIZE__ -Wall tStream.cc | /usr/local/bin/lib/gcc-cc1plus -quiet -dumpbase tStream.cc -fstrength-reduce -felide-constructors -fschedule-insns -fdelayed-branch -fsave-memoized -fthis-is-variable -g -O -Wall -version -o - | as - -o tStream.o GNU C++ version 1.36.1 (based on GCC 1.36) (sparc) compiled by GNU C version 1.36. default target switches: -mfpu -mepilogue -msun-asm GNU CPP version 1.36 g++ tStream.o -o tStream -L../src -lg++ -lm -------------------------------------------------------------- When the program is compiled as below (without the -fthis-is-variable the program runs correctly: -------------------------------------------------------------- g++ -I../g++-include -g -O -fstrength-reduce -felide-constructors -fschedule-insns -fdelayed-branch -fsave-memoized -Wall -v -pipe -c tStream.cc gcc version 1.36.1 (based on GCC 1.36) /usr/local/bin/lib/gcc-cpp -+ -v -I../g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__OPTIMIZE__ -Wall tStream.cc | /usr/local/bin/lib/gcc-cc1plus -quiet -dumpbase tStream.cc -fstrength-reduce -felide-constructors -fschedule-insns -fdelayed-branch -fsave-memoized -g -O -Wall -version -o - | as - -o tStream.o GNU C++ version 1.36.1 (based on GCC 1.36) (sparc) compiled by GNU C version 1.36. default target switches: -mfpu -mepilogue -msun-asm GNU CPP version 1.36 g++ tStream.o -o tStream -L../src -lg++ -lm *Boingo[523]tests% tStream Hellofromthestreamtestor Final names & states: cin: (stdin) 0 cout: (stdout) 0 cerr: (stderr) 0 end of test. *Boingo[524]tests% -------------------------------------------------------------- Another problem I have had is that the -traditional flag does not do what the documentation says it should. The following code does not compile with the -traditional flag: -------------------------------------------------------------- static int b; function(int dumb) { const int a = 1; extern int b; char *p; printf(a==p); } *Boingo[425]mpredit% g++ -traditional -v -c test.c gcc version 1.36.1 (based on GCC 1.36) /usr/local/bin/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -traditional test.c /usr/tmp/cca22967.cpp GNU CPP version 1.36 /usr/local/bin/lib/gcc-cc1plus /usr/tmp/cca22967.cpp -quiet -dumpbase test.c -traditional -version -o /usr/tmp/cca22967.s GNU C++ version 1.36.1 (based on GCC 1.36) (sparc) compiled by GNU C version 1.36. default target switches: -mfpu -mepilogue -msun-asm test.c: In function int function (...): test.c:9: warning: implicit declaration of function `printf' test.c:9: comparison between pointer and integer *Boingo[426]mpredit% -------------------------------------------------------------- I believe that this should compile correctly. In general it seems that -traditional does not act at all like it is documented or as it works in gcc. I hope that the above reports are complete and helpful. I am amazed by the amount of great stuff available for free from gnu. Thanks to all of you for a great effort. Derek Ney derek@boingo.med.jhu.edu (128.220.55.210) (301)955-5173