[comp.sys.amiga.tech] Bugs in Lattice C version 5.04

rick@anasaz.UUCP (Rick Coupland) (01/09/90)

Over the past year or so, I have discovered several bugs in release 5
of the Lattice C compiler.  Most of these have been discovered very
painfully by tracking down what I originaly thought were bugs in my
own code.

All but one of these problems were reported to Lattice (on the Lattice BBS)
in Feb. or March of 89.  I had hoped that all or most of these bugs would
be fixed in 5.04.  However, of the bugs I reported during this period,
only one was fixed.

I am posting this in hopes that this information will save others some
time and frustration in tracking down these bugs.  I am also hopeful
that these problems will be fixed by Lattice.

The following files are a set of small test programs.  Each of these files
demonstrates one bug in Lattice C 5.04 and contains comments explaining the
problem and giving compiler options which were used.

---------------------------------------------------------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  rpcbug6.c rpcbug7.c rpcbug9.c rpcbug10.c rpcbug11.c
#   asmbug.a
# Wrapped by rick@rick on Mon Jan  8 13:57:47 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'rpcbug6.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpcbug6.c'\"
else
echo shar: Extracting \"'rpcbug6.c'\" \(643 characters\)
sed "s/^X//" >'rpcbug6.c' <<'END_OF_FILE'
X/*
X**  When this file is compiled by version 5.02 of the Lattice Amiga C
X**  compiler, the generated code is incorrect.  A long int is pushed
X**  onto the stack for the first argument in the call to tstsub even
X**  though the -w (short ints) option is being used.  According to
X**  "THE C PROGRAMMING LANGUAGE" by Kernighan and Ritchie, Appendix A
X**  section 6.4 "Two pointers to objects of the same type may be
X**  subtracted; in this case the result is converted to an integer...".
X**  
X**  The exact command line used for the compile is given below:
X**
X**     lc -w -d rpcbug6.c
X*/
Xvoid tst(p1, p2)
Xchar *p1, *p2;
X{
X	tstsub(p2 - p1, 0);
X}
END_OF_FILE
if test 643 -ne `wc -c <'rpcbug6.c'`; then
    echo shar: \"'rpcbug6.c'\" unpacked with wrong size!
fi
# end of 'rpcbug6.c'
fi
if test -f 'rpcbug7.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpcbug7.c'\"
else
echo shar: Extracting \"'rpcbug7.c'\" \(568 characters\)
sed "s/^X//" >'rpcbug7.c' <<'END_OF_FILE'
X/*
X**  When this file is compiled by version 5.02 of the Lattice Amiga C
X**  compiler, the generated code is incorrect.  The wrong value is assigned
X**  to the variable p1 prior to entering the for loop.  The variable p2
X**  is incremented prior to assigning its value to p1.
X**
X**  The exact command line used for the compile is given below:
X**
X**     lc -d rpcbug7.c
X*/
X
Xchar *tst(ptr, x)
Xchar *ptr;
Xint x;
X{
X    char *p1, *p2;
X
X    if (p2 = ptr) {
X	if (*p2 == '=') {
X	    p1 = p2;
X	    *p2++ = 0;
X	    for (--p1; *p1 == ' '; *p1 = 0)
X		;
X	}
X    } 
X    return p2;
X}
END_OF_FILE
if test 568 -ne `wc -c <'rpcbug7.c'`; then
    echo shar: \"'rpcbug7.c'\" unpacked with wrong size!
fi
# end of 'rpcbug7.c'
fi
if test -f 'rpcbug9.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpcbug9.c'\"
else
echo shar: Extracting \"'rpcbug9.c'\" \(710 characters\)
sed "s/^X//" >'rpcbug9.c' <<'END_OF_FILE'
X/*
X**  When this file is compiled by version 5.02 of the Lattice Amiga C
X**  compiler, the generated code is incorrect.  The wrong value is assigned
X**  to the variable memlist.  The value of "ptr" is stored into memlist
X**  after being modified by statements 24 & 25.
X**
X**  The exact command lines used for the compile are given below:
X**
X**     lc -d rpcbug9.c
X**
X*/
Xstatic char *memlist;
Xchar *tst(size)
Xint size;
X{
X    register char *lptr;
X    register int tsize;
X    char *ptr;
X
X    if ( !(ptr = (char *)gmem(tsize = size+sizeof(char *)+sizeof(int))) )
X		ferr("Out of memory", 1);
X    lptr = memlist;
X    memlist = ptr;
X    *((*(int **)&ptr)++) = tsize;
X    *((*(char ***)&ptr)++) = lptr;
X	return ptr;
X}
END_OF_FILE
if test 710 -ne `wc -c <'rpcbug9.c'`; then
    echo shar: \"'rpcbug9.c'\" unpacked with wrong size!
fi
# end of 'rpcbug9.c'
fi
if test -f 'rpcbug10.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpcbug10.c'\"
else
echo shar: Extracting \"'rpcbug10.c'\" \(793 characters\)
sed "s/^X//" >'rpcbug10.c' <<'END_OF_FILE'
X/*
X**  When this file is compiled by version 5.02 of the Lattice Amiga C
X**  compiler, the generated code does not evaluate the expression on line
X**  34 correctly.  The subexpression "(pgad - gadlist)" is evaluated first
X**  with the result left in d1.  This value is then discarded and the
X**  remainder of the code assumes the result is in d0 rather than d1.  
X**  If line 35 is removed, the code is correct.
X**
X**  The exact command line used for the compile is given below:
X**
X**     lc -w -d rpcbug10.c
X*/
Xtypedef struct {
X    int xyz;
X    char abc[7];
X} GadDef;
X
Xextern unsigned int numgads;
Xextern GadDef gadlist[100];
X
Xvoid tst(pgad)
XGadDef *pgad;
X{
X    int mvlen;
X
X    mvlen = (numgads - (pgad - gadlist) - 1) * sizeof(GadDef);
X    memcpy((char *)pgad, (char *)(pgad + 1), mvlen);
X}
END_OF_FILE
if test 793 -ne `wc -c <'rpcbug10.c'`; then
    echo shar: \"'rpcbug10.c'\" unpacked with wrong size!
fi
# end of 'rpcbug10.c'
fi
if test -f 'rpcbug11.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpcbug11.c'\"
else
echo shar: Extracting \"'rpcbug11.c'\" \(395 characters\)
sed "s/^X//" >'rpcbug11.c' <<'END_OF_FILE'
X/*
X**  When this file is compiled by version 5.04 of the Lattice Amiga C
X**  compiler, a "CXERR 99" error is generated by lc2.  The problem is
X**  aparently caused by the "if" statement.
X**
X**  The exact command lines used for the compile are given below:
X**
X**     lc -d rpcbug9.c
X**
X*/
Xtst(a, b)
Xlong a, b;
X{
X	long ltmp;
X
X	ltmp = a * b;
X	if (*((short *)&ltmp) > 1)
X		return 1;
X    return 0;
X}
END_OF_FILE
if test 395 -ne `wc -c <'rpcbug11.c'`; then
    echo shar: \"'rpcbug11.c'\" unpacked with wrong size!
fi
# end of 'rpcbug11.c'
fi
if test -f 'asmbug.a' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'asmbug.a'\"
else
echo shar: Extracting \"'asmbug.a'\" \(571 characters\)
sed "s/^X//" >'asmbug.a' <<'END_OF_FILE'
X**  Lattice Amiga Assembler, version 5.01
X**
X**  When a file is assembled which contains an unitialized data section
X**  containing initialized data, the assembler does not generate an error
X**  message.  However, neither blink nor omd will accept the object file
X**  produced by the assembler as being valid.  Omd gives the message
X**  "Invalid Hunk type".  It would be nice if asm detected this condition
X**  as an error rather than producing an invalid object file.
X**
X**  This file demonstrates the problem.
X
X	CSECT	udata,2,,2,2
X	xdef	_AA
X_AA	ds.l	1
X_BB	dc.l	0
X
X	end
END_OF_FILE
if test 571 -ne `wc -c <'asmbug.a'`; then
    echo shar: \"'asmbug.a'\" unpacked with wrong size!
fi
# end of 'asmbug.a'
fi
echo shar: End of shell archive.
exit 0
-- 
Rick Coupland	...!{noao!asuvax | mcdphx}!anasaz!rick
(602) 870-3330