C++ buffer overrun

user3624136 picture user3624136 · Aug 20, 2014 · Viewed 9.4k times · Source

I'm learning C++ and whilst I have a reasonable understanding of C# I've never run into this issue before. With a simple program that places chess pieces on an imaginary board (an enumerated array) and then assigns the squares which would have pieces at the start their pieces, you are then asked for coordinates and the program returns what is on that square. It displays the correct piece yet will always crash in non-debugging mode and display a buffer overrun in Visual Studio debugging. It's quite short so I'll show all the code.

#include <iostream>
#include <string>
using namespace std;
int main() {
enum Chessboard {
    Blank,
    Pawn,
    Rook,
    Knight,
    Bishop,
    King,
    Queen
};
Chessboard board[8][8] = { Blank };
for (int x = 1; x < 8; x++)
{
    board[1][x] = Pawn;
    board[8][x] = Pawn;
}
board[7][0] = Rook;
board[7][1] = Knight;
board[7][2] = Bishop;
board[7][3] = King;
board[7][4] = Queen;
board[7][5] = Bishop;
board[7][6] = Knight;
board[7][7] = Rook;
board[0][0] = Rook;
board[0][1] = Knight;
board[0][2] = Bishop;
board[0][4] = King;
board[0][3] = Queen;
board[0][5] = Bishop;
board[0][6] = Knight;
board[0][7] = Rook;

int X = 0;
int Y = 0;
bool Error = false;
cout << "Enter the coordinates of a square on a chessboard to see what is on there at    the start of the game (1 number at a time)" << endl;
do {
    cin >> X;
    X--;
    Error = false;
    if (X < 0 || X > 7)
    {
        cout << "That's not on the board" << endl;
        Error = true;
    }
} while (Error = false);
do {
    cin >> Y;
    Y--;
    Error = false;
    if (Y < 0 || Y > 7)
    {
        cout << "That's not on the board" << endl;
        Error = true;
    }
} while (Error = false);

string Name = "";
Chessboard Piece = board[X][Y];
switch (Piece)
{
case Blank: Name = "nothing";
    break;
case Pawn: Name = "a Pawn";
    break;
case Rook: Name = "a Rook";
    break;
case Knight: Name = "a Knight";
    break;
case Bishop: Name = "a Bishop";
    break;
case King: Name = "a King";
    break;
case Queen: Name = "a Queen";
    break;
default: Name = "Somehow you missed the board";
    break;
} 

cout << "On " << ++X << "," << ++Y << " there is " << Name << endl;

return 0;
}

Answer

AndersK picture AndersK · Aug 20, 2014

You are going outside the boundaries of your matrix

   board[1][x] = Pawn;
   board[8][x] = Pawn;

You declared it 8x8 so index 0..7 are to be used.