This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Bug report (fwd)
- To: gcc-bugs at gcc dot gnu dot org
- Subject: Bug report (fwd)
- From: "Abhishek Sharma-RollNo.2000-1" <abhishek at gdit dot iiit dot net>
- Date: Wed, 11 Apr 2001 22:03:18 +0530 (IST)
Hi ,
We ( Abhishek Sharma & Mukul Bansal ) believe that we have found a bug in
the gcc compiler (RedHat linux 7). The bug was found while developing a
chess program . The necessary header files as well as the simplified main
program are attached .You are kindly requested to run the program and
inform us as to what the problem might be .
Problem : The header files mate1.h and mate2.h are identical except that
in file mate2.h , array n is being copied to array m and then array m
is being used to perform the calculations .In file mate1 , array n is
being used directly . However , mate1.h and mate2.h give different outputs
when included , which should not be the case .
NOTE : mainprog1.c uses mate1.h while mainprog2.c uses mate2.h .
Thank you,
waiting for your reply ,
abhishek@gdit.iiit.net
mukul@gdit.iiit.net
/* Main program including file mate1.h */
#include<stdio.h>
int a[2][64];
#include"init1.h"
#include"pmoves.h"
#include"check.h"
#include"mate1.h"
main ()
{
int r;
initchess(1);
r=mate(2);
printf("\n \n mate = %d\n ",r);
}
/* Main program including file mate2.h */
#include<stdio.h>
int a[2][64];
#include"init1.h"
#include"pmoves.h"
#include"check.h"
#include"mate2.h"
main ()
{
int r;
initchess(1);
r=mate(2);
printf("\n \n mate = %d\n ",r);
}
int check(int turn)
{
/* if turn =1 then players turn , if turn=2 then computers turn*/
int c=0,d=0,i,j,*m,de=0;
for (i=0;i<=63;i++)
{
if(a[0][i]=='g' && a[1][i]==1 )
c = i;
if(a[0][i]=='g' && a[1][i]==2)
d = i;
}
for (i=0;i<=63;i++)
{
switch (a[0][i])
{
case 'q':
if (a[1][i]==2 && turn==1)
{
m = queen (i);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=queen (i);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
case 'k':
if (a[1][i]==2 && turn==1)
{
m = knight (i);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=knight (i);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
case 'r':
if (a[1][i]==2 && turn==1)
{
m = rook (i);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=rook (i);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
case 'b':
if (a[1][i]==2 && turn==1)
{
m = bishop (i);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=bishop (i);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
case 'g':
if (a[1][i]==2 && turn==1)
{
m = king (i,0,1,1,1);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=king (i,0,1,1,1);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
case 'p':
if (a[1][i]==2 && turn==1)
{
m = pawn (i);
for(j=1;j<=m[0];j++)
if(c==m[j] )
de=1;
}
else if(a[1][i]==1 && turn==2)
{
m=pawn (i);
for(j=1;j<=m[0];j++)
if(d==m[j] )
de=1;
}
break;
}
if (de==1)
break;
}
return de;
}
initchess(int co)
{
int i;
for (i=16;i<=47;i++)
a[0][i]=a[1][i]=0;
for (i=8;i<=15;i++)
{
a[0][i]=a[0][40+i]='p';
a[1][i]=2;
a[1][40+i]=1;
a[1][15-i]=2;
a[1][48+i]=1;
}
a[0][0]=a[0][7]=a[0][56]=a[0][63]='r';
a[0][1]=a[0][6]=a[0][57]=a[0][62]='k';
a[0][2]=a[0][5]=a[0][58]=a[0][61]='b';
if (co==2)
{
a[0][3]=a[0][59]='g';
a[0][4]=a[0][60]='q';
}
else
{
a[0][3]=a[0][59]='q';
a[0][4]=a[0][60]='g';
}
a[0][1]=0;
a[1][1]=0;
a[0][3]='k';
a[1][3]=2;
a[0][6]=0;
a[1][6]=0;
a[0][12]=0;
a[1][12]=0;
a[0][14]=0;
a[1][14]=0;
a[0][21]='k';
a[1][21]=1;
a[0][22]='p';
a[1][22]=2;
a[0][23]='k';
a[1][23]=2;
a[0][28]='p';
a[1][28]=2;
a[0][39]='p';
a[1][39]=1;
a[0][40]='b';
a[1][40]=1;
a[0][41]='p';
a[1][41]=1;
a[0][49]=0;
a[1][49]=0;
a[0][54]=0;
a[1][54]=0;
a[0][57]=0;
a[1][57]=0;
a[0][58]=0;
a[1][58]=0;
}
int* knight(int x)
{
static int k[9],y,p;
int c=0;
p=a[1][x];
y=x%8;
if (y>=2)
{
if(x<=55 && a[1][x+6]!=p)
{
c++;
k[c]=x+6;
}
if(x>=10 && a[1][x-10]!=p)
{
c++;
k[c]=x-10;
}
}
if (y<=5)
{
if(x<=53 && a[1][x+10]!=p)
{
c++;
k[c]=x+10;
}
if(x>=8 && a[1][x-6]!=p)
{
c++;
k[c]=x-6;
}
}
if(y<=6)
{
if(x<=46 && a[1][x+17]!=p)
{
c++;
k[c]=x+17;
}
if(x>=16 && a[1][x-15]!=p)
{
c++;
k[c]=x-15;
}
}
if(y>=1)
{
if(x<=47 && a[1][x+15]!=p)
{
c++;
k[c]=x+15;
}
if(x>=17 && a[1][x-17]!=p)
{
c++;
k[c]=x-17;
}
}
k[0]=c;
return k;
}
int* bishop(int x)
{
static int x1,bi[15],i,o,p;
int j=0;
x1=x;
p=a[1][x];
o=3-p;
for(i=1;i<9;i++)
{
if(x%8==7 || x>55)
break;
x=x+9;
if(a[1][x]==p) break;
bi[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0 || x<7) break;
x=x-9;
if(a[1][x]==p) break;
bi[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0 || x>55) break;
x=x+7;
if(a[1][x]==p) break;
bi[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==7 || x<7) break;
x=x-7;
if(a[1][x]==p) break;
bi[++j]=x;
if(a[1][x]==o) break;
}
bi[0]=j;
return bi;
}
int* rook(int x)
{
static int x1,r[15],i,p,o;
int j=0;
x1=x;
p=a[1][x];
o=3-p;
for(i=1;i<9;i++)
{
if (x>55)
break;
x=x+8;
if(a[1][x]==p) break;
r[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x<8) break;
x=x-8;
if(a[1][x]==p) break;
r[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==7) break;
x=x+1;
if(a[1][x]==p) break;
r[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0) break;
x=x-1;
if(a[1][x]==p) break;
r[++j]=x;
if(a[1][x]==o) break;
}
r[0]=j;
return r;
}
int* queen(int x)
{
static int x1,q[30],i,p,o;
int j=0;
x1=x;
p=a[1][x];
o=3-p;
for(i=1;i<9;i++)
{
if(x%8==7 || x>55)
break;
x=x+9;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0 || x<7) break;
x=x-9;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0 || x>55) break;
x=x+7;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==7 || x<7) break;
x=x-7;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if (x>55)
break;
x=x+8;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x<8) break;
x=x-8;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==7) break;
x=x+1;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
x=x1;
for(i=1;i<9;i++)
{
if(x%8==0) break;
x=x-1;
if(a[1][x]==p) break;
q[++j]=x;
if(a[1][x]==o) break;
}
q[0]=j;
return q;
}
int* king(int x,int chek, int kingmov,int rookmov1,int rookmov2)
{
static int g[12],p,y;
int c=0;
y=x%8;
p=a[1][x];
if(x<=55 && a[1][x+8]!=p)
{
c++;
g[c]=x+8;
}
if(x>=8 && a[1][x-8]!=p)
{
c++;
g[c]=x-8;
}
if(y<=6 && a[1][x+1]!=p)
{
c++;
g[c]=x+1;
}
if (y>=1 && a[1][x-1]!=p)
{
c++;
g[c]=x-1;
}
if (y>=1 && x<=55 && a[1][x+7]!=p)
{
c++;
g[c]=x+7;
}
if (y<=6 && x<=54 && a[1][x+9]!=p)
{
c++;
g[c]=x+9;
}
if(y<=6 && x>=8 && a[1][x-7]!=p)
{
c++;
g[c]=x-7;
}
if(y>=1 && x>=9 && a[1][x-9]!=p)
{
c++;
g[c]=x-9;
}
g[0]=c;
return g;
}
int* pawn(int x)
{
static int pa[6],p,y;
int c=0;
y=x%8;
p=a[1][x];
if(p==2)
{
if(x>=8 && x<=15 && a[0][x+16]==0 && a[0][x+8]==0)
{
c++;
pa[c]=x+16;
}
if (a[0][x+8]==0 && (x+8)<=63)
{
c++;
pa[c]=x+8;
}
if (a[1][x+7]==1 && y>=1 && x<=55)
{
c++;
pa[c]=x+7;
}
if (a[1][x+9]==1 && y<=6 && x<=54)
{
c++;
pa[c]=x+9;
}
pa[0]=c;
return pa;
}
else if(p==1)
{
if( x<=55 && x>=48 && a[0][x-16]==0 && a[0][x-8]==0)
{
c++;
pa[c]=x-16;
}
if (a[0][x-8]==0 && x>=8)
{
c++;
pa[c]=x-8;
}
if (a[1][x-7]==2 && y<=6 && x>=8)
{
c++;
pa[c]=x-7;
}
if (a[1][x-9]==2 && y>=1 & x>=9)
{
c++;
pa[c]=x-9;
}
pa[0]=c;
return pa;
}
}
int mate(int turn)
{
int *n,i,j,p,q,d,t[2][2];
int m[22];
p=check(turn);
q=1;
for (i=0;i<=63;i++)
{
if(a[1][i]==turn)
{
switch(a[0][i])
{
case 'k': n=knight(i);
break;
case 'g': n=king(i,0,1,1,1);
break;
case 'p': n=pawn(i);
break;
case 'b': n=bishop(i);
break;
case 'r': n=rook(i);
break;
case 'q': n=queen(i);
break;
}
/* without coping n to m */
/* NOTE : n[0] contains maximum number of moves for the piece */
j=1;
printf("\n moves for piece :%c : ",a[0][i]);
while(j<=n[0])
{
d=n[j]; /* here d=n[j] */
j++;
t[0][0]=a[0][i];
t[1][0]=a[1][i];
t[0][1]=a[0][d];
t[1][1]=a[1][d];
a[0][d]=a[0][i];
a[1][d]=a[1][i];
a[0][i]=0;
a[1][i]=0;
printf(" %d , ",d);
q=check(turn);
a[0][i]=t[0][0];
a[1][i]=t[1][0];
a[0][d]=t[0][1];
a[1][d]=t[1][1];
if(q==0) return 0;
}
if(q==0) return 0;
}
}
if (p==1 && q==1)
return 1;
if (p==0 && q==1)
return 2;
}
int mate(int turn)
{
int *n,i,j,p,q,d,t[2][2];
int m[22];
p=check(turn);
q=1;
for (i=0;i<=63;i++)
{
if(a[1][i]==turn)
{
switch(a[0][i])
{
case 'k': n=knight(i);
break;
case 'g': n=king(i,0,1,1,1);
break;
case 'p': n=pawn(i);
break;
case 'b': n=bishop(i);
break;
case 'r': n=rook(i);
break;
case 'q': n=queen(i);
break;
}
for(j=0;j<=n[0];j++) /* copying n to m */
m[j]=n[j];
/* NOTE: n[0] contains the maximum number of moves for the piece */
j=1;
printf("\n moves for piece :%c : ",a[0][i]);
while(j<=m[0])
{
d=m[j]; /* here d=m[j]
note that array m = array n */
j++;
t[0][0]=a[0][i];
t[1][0]=a[1][i];
t[0][1]=a[0][d];
t[1][1]=a[1][d];
a[0][d]=a[0][i];
a[1][d]=a[1][i];
a[0][i]=0;
a[1][i]=0;
printf(" %d , ",d);
q=check(turn);
a[0][i]=t[0][0];
a[1][i]=t[1][0];
a[0][d]=t[0][1];
a[1][d]=t[1][1];
if(q==0) return 0;
}
if(q==0) return 0;
}
}
if (p==1 && q==1)
return 1;
if (p==0 && q==1)
return 2;
}