mike@BRL.MIL (Mike Muuss) (09/21/88)
This evening, I ran into the most horrid bug in the C Compiler on the SGI 4-D machines, under Release 3.0 and 3.1alpha both. It all came about from these messages: ccom: Warning: ../h/vmath.h, line 53: inconsistent prototypes for function sqrt extern double sqrt(); ------------------------------^ because my header file "vmath.h" wants to be certain that sqrt() has been properly declared. The entry from SGI's /usr/include/math.h is: extern double cbrt(double), sqrt(double); Not reading that carefully, I had originally assumed that this was the ANSI way of doing things, and even though __STDC__ was not defined by SGI, I changed vmath.h to read: #ifndef sqrt # if defined(__STDC__) || \ (defined(sgi) && defined(mips) && !defined(SGI4D_Rel2)) extern double sqrt(double _sqrt_arg_x); # else extern double sqrt(); # endif #endif This caused the error messages to go away, but gave me mysterious errors in all my programs; all of which pointed to a malloc() problem. Wrong. What was happening was the extern sqrt() declaration gave every subroutine IN THAT MODULE a free first argument (of type double), called "_sqrt_arg_x". This caused all the visibly declared arguments to take on the value of their neighbor, and the last one got junk. Probably the parser pushed the arg onto a list of args in some "global" block, and never popped it off. I would like to add in passing that SGI's "dbx" program was of no help whatsoever, printing 5 invented numbers as the arguments to the functions in the stack traceback ("where" command). I had to resort to printf()s, printing the parameters sent, and more printf()s printing the parameters received. So, for the time being, my new version of vmath.h contains this contortion: #ifndef sqrt /* In case <math.h> has not been included, define sqrt() here */ # if defined(__STDC__) extern double sqrt(double x); # else # if (defined(sgi) && defined(mips) && !defined(SGI4D_Rel2)) /* What could SGI have been thinking of? */ extern double sqrt(double); # else extern double sqrt(); # endif # endif #endif This version (a) still silences the compiler, and (b) gives the subroutines the right argument list. SGI's graphics is great. The 4-D GT is breath-taking. When things work, they work rapidly. But, when is somebody going to show SGI how to write software? The single most often repeated phrase in our office is "G** D**n SGI software!". Fuming, -Mike