This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Bug report (fwd)






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;
  }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]