c/1061: bug in short arithmetic

matsc@sics.se matsc@sics.se
Thu Dec 14 05:46:00 GMT 2000


>Number:         1061
>Category:       c
>Synopsis:       bug in short arithmetic
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Thu Dec 14 05:46:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Mats Carlsson
>Release:        gcc version 2.95.2 19991024 (release)
>Organization:
>Environment:
SunOS scheutz 5.7 Generic_106541-12 sun4u sparc SUNW,Ultra-Enterprise
>Description:
The attached program should not print OOPS.
The variable 'datum' seems to get the wrong value,
causing a comparison to fail.
>How-To-Repeat:
gcc -O2 sparc_bug.c ; ./a.out

#include <stdio.h>

typedef unsigned short HALF;

# define revhalf(S) ((((S)&0xff)<<8)|(((S)&0xff00)>>8))

static HALF dest[] = {0xf801,0x0};

main()
{
  HALF datum;

  datum = dest[0];
  if (datum & 1)
    datum = revhalf(datum);
  if (datum!=0x1f8)
    printf("OOPS\n");
  exit(0);
}
>Fix:
Work-around: declare datum as unsigned int instead.
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the Gcc-bugs mailing list