[comp.graphics] QRT initialization bug & fix

pab@naucse.UUCP (Paul Balyoz) (03/12/89)

Having fixed the toupper and malloc strlen+1 bugs in QRT,
we still couldn't run it successfully on any of the demo
".qrt" files supplied.  After 5-15 minutes of run-time on
our Microvax 3500 running Ultrix 2.2, the program would
core-dump reporting an "illegal instruction error".

After many hours of debugging I finally discovered that
in some portions of the code, CINFO structures are alloc-
ated and then copied elsewhere without first being init-
ialized.  Other data types such as ints and longs would
put up with this behavior, but not floats!  On our machine,
if the data at the address in memory where a float was
allocated just happens to be 32768 (decimal), the float
equivalent of it is actually infinite, and all attempts
to read it cause a core dump.  It's really unsettling when
dbx core-dumps itself and kicks you back to the shell
while trying to track something like this down!  (And all
the time I thought this sort of thing would be a "Floating-
Point Exception"....)

Anyway, here's a context diff which solves the problem.
It's a kludge; my only purpose was to get it running with
the least modifications.  If you've been having problems
like we have, then use this patch; otherwise wait for the
official (and more aesthetic) patch to come from the
author himself.

QRT is really a nice ray tracer!  Much thanks to Mr. Koren
for allowing others to use his fine program.

						-- paul




*** /tmp/,RCSt1016666	Sat Mar 11 20:39:19 1989
--- inout.c	Sat Mar 11 17:56:01 1989
***************
*** 75,80
    CINFO cinfo;
    int found;
  
    name=NULL; queue=NULL;
    VectEqZero(&loc);
    VectEqZero(&rad);

--- 75,82 -----
    CINFO cinfo;
    int found;
  
+   def_colorinfo (&cinfo);		/* Initialize it to SOMETHING!  pab */
+ 
    name=NULL; queue=NULL;
    VectEqZero(&loc);
    VectEqZero(&rad);
***************
*** 468,473
    VECTOR loc, lk, up, dir, v3, upper, lower;
    CINFO  cinfo;
    int    end, f, found;
  
    end=f=0;
    up.x = up.z = 0; up.y = 1;

--- 470,477 -----
    VECTOR loc, lk, up, dir, v3, upper, lower;
    CINFO  cinfo;
    int    end, f, found;
+ 
+   def_colorinfo (&cinfo);		/* Initialize it to SOMETHING!  pab */
  
    end=f=0;
    up.x = up.z = 0; up.y = 1;
*** /tmp/,RCSt1016686	Sat Mar 11 20:39:33 1989
--- stack.c	Sat Mar 11 17:50:05 1989
***************
*** 204,209
    VECTOR  loc,v1,v2,v3, upper, lower;
    OBJ_PTR line;
  
    VectEqZero(&loc);
    VectEqZero(&v1);
    VectEqZero(&v2);

--- 204,211 -----
    VECTOR  loc,v1,v2,v3, upper, lower;
    OBJ_PTR line;
  
+   def_colorinfo (&cinfo);	/* Initialize cinfo to SOMETHING!  pab */
+ 
    VectEqZero(&loc);
    VectEqZero(&v1);
    VectEqZero(&v2);



-- 
Paul Balyoz, Software Specialist II    ...!arizona!naucse!root
Northern Arizona University                  --or--
PO Box 15600                           ...!arizona!naucse!pab
Flagstaff, AZ 86011