Bug report in egcs 1.1.2

Olivier Baudron Olivier.Baudron@ens.fr
Sat Mar 20 14:55:00 GMT 1999


Ok, I can know provide a short program that show a bug in egcs (with
optimization -O2).

essai.c:

/* ----------------------- CUT HERE ---------------------------*/
#include <stdio.h>

unsigned short in_cksum(unsigned short *addr, int len) {
    register int sum = 0;
    unsigned short answer = 0;
    register unsigned short *w = addr;
    register int nleft = len;
    while ( nleft > 1 ) {
	sum += *w++;
	nleft -= 2;
    }

    if ( nleft == 1 ) {
	*(unsigned char *)(&answer) = *(unsigned char *)w ;
	sum += answer;
    }
    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    printf ("answer=%hu\n", answer);
    return answer;
}

int main (int argc, char **argv) {
    unsigned short
a[170]={0,0,0,0,4352,16129,50900,337,50900,64849,17152,17408,16129,26693,258,262,25564,25946,1280,0,0,0,50900,64849,50900,593,50900,337,16384,57861,30512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33379,25427,309,13826,54276,198,13126,4,7168,14880,4,3584,15120,4,6144,412,65284,65535,768,54276,20934,1537,54280,198,54338,198,3907,25357,25209,29285,24931,27746,11877,29286,1052,50900,65361,255};
    unsigned short b;

    b = in_cksum (a, 339);
    return 0;
}
/* ----------------------- CUT HERE ----------------------------------- */


The results are:

% gcc -O2 -Wall -o essai2 essai2.c
% essai2
answer=255
% gcc -Wall -o essai2 essai2.c
% essai2
answer=0

The correct result is 0.

Olivier.


More information about the Gcc-bugs mailing list