🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #2887

unsigned longs in gcc 1.37 on decstation

#2887
From: Bob Stocker
Date: Fri, 23 Feb 1990 01:41
88 lines
2733 bytes
I ran across the following bug in gcc Version 1.37 running on a
DECsystem 5400 under RISC Ultrix Version 3.1C (Revision 41).

Gcc was configured for a decstation and, with two exceptions, was
compiled according to the instructions in gcc-1.37/INSTALL.  First, I
changed the declaration of tree_code_name in config/out-mips.c from

	extern char *tree_code_name[];
to

	extern char **tree_code_name;

so that it would be compatible with the declarations of tree_code_name
in g++-1.36.4/tree.h.  Second, since gcc on a decstation does not
support the -g flag, I used the command

          make CC=stage1/gcc CFLAGS="-O -Bstage1/"

to recompile gcc with itself.

The following shell script displays the bug:

csh> strings /vmunix | grep Ultrix
strings /vmunix | grep Ultrix
Ultrix V3.1C (Rev. 41) System #1: Fri Jan  5 11:48:15 MST 1990

csh> gcc -v
gcc -v
gcc version 1.37

csh> cd ~/test
cd ~/test

csh> cat gccbug.c
cat gccbug.c
#define SHORTBITS	16
#define I_SHIFT         SHORTBITS
#define I_MAXNUM	((unsigned long)65535L)

unsigned long down(unsigned long x)
{
  return (x >> I_SHIFT) & I_MAXNUM;
}

main() {
  unsigned short a[2];
  unsigned short b[2];
  unsigned long hi = 1;
  unsigned short* ap = &a[0];
  unsigned short* bp = &b[0];
  unsigned short* topb = &b[2];
  a[0] = 1; a[1] = 0;
  b[0] = 0; b[1] = 1;
  while (bp < topb) {
    printf("%lu + %u + %lu - %u = ", hi, *ap, I_MAXNUM, *bp);
    hi += (unsigned long)(*ap++) + I_MAXNUM - (unsigned long)(*bp++);
    printf("%lu\n", hi);
    hi = down(hi);
  }
}

csh> gcc gccbug.c
gcc gccbug.c

csh> a.out
a.out
1 + 1 + 65535 - 0 = 1
0 + 0 + 65535 - 1 = 4294967294

The native C compiler produces code that runs correctly.

I first ran into this bug when I compiled libg++-1.36.3/src/Integer.cc
with g++ version 1.36.4 (based on GCC 1.36.93).  Lines similar to the
one that produces the bug appear several places in Integer.cc.  I
found that splitting those lines into lines like

    hi += (unsigned long)(*ap++) + I_MAXNUM;
    hi -= (unsigned long)(*bp++);

got around the problem.

Please let me know if I can provide you with any further information
or can help you in any other way.

Bob Stocker
Director of Academic Computing
University of Denver
bstocker@du.edu
Technical Details
Message-ID: <9002230141.AA20300@diana.cair.du.edu>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!DIANA.CAIR.DU.EDU!bstocker

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!DIANA.CAIR.DU.EDU!bstocker
From: bstocker@DIANA.CAIR.DU.EDU (Bob Stocker)
Newsgroups: gnu.gcc.bug
Subject: unsigned longs in gcc 1.37 on decstation
Message-ID: <9002230141.AA20300@diana.cair.du.edu>
Date: 23 Feb 90 01:41:56 GMT
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 88