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


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]