переполнение буфера при загрузке из предыдущего сохраненного файла - PullRequest
0 голосов
/ 12 января 2012

Я сделал текстовое приключение с возможностью загрузки / сохранения. В папке я создал игру, она работала нормально. И даже если я делаю релизную версию своей игры, все работает так, как должно.

Но я должен передать этот проект своему профессору. На моем ПК сохранение и загрузка работают нормально, но на моем ноутбуке или в копии моей папки проекта я получаю сообщение об ошибке «переполнение буфера произошло». Так в чем здесь моя вина?

Мой код для загрузки / сохранения:

bool save()
{
    char sFileText[1024];
    char sFileName[80];
    char sFileDirectory[80];

     GetCurrentDirectory(512, sFileDirectory); 

    sprintf(sFileName, "%s\\save_game.ini", sFileDirectory);

    sprintf(sFileText, "[settings]\n\rsp_loop=%i\n\rroom_iSelect=%i\n\riSelect=%i\n\rraum=%i\n\rtor402=%i\n\rwegiSelect=%i\n\rwegweiser=%i\n\rlight=%i\n\ropen_door=%i\n\rmesser=%i\n\rmesserwurf=%i\n\rkamera=%i\n\rstein=%i\n\ralive=%i\n\rpfeil=%i\n\rluke=%i\n\rkuehlschrank=%i\n\rpulver_schmand=%i\n\rteddy=%i\n\rseil=%i\n\rgiftklinge=%i\n\r",
         sp_loop,
         room_iSelect,
         iSelect,
         raum,
         tor402,
         wegiSelect,
         wegweiser,
         light,
         open_door,
         messer,
         messerwurf,
         kamera,
         stein,
         alive,
         pfeil,
         luke,
         kuehlschrank,
         pulver_schmand,
         teddy,
         seil,
         giftklinge
        );


    int cur_char;
    FILE *out_file;

    out_file = fopen(sFileName, "w");
    if (!out_file == NULL) 
    {
        for (cur_char = 0; cur_char < strlen(sFileText); ++cur_char) 
        {
            fputc(sFileText[cur_char], out_file);
        }
    }
    else
    {
        return false;
    }

    fclose(out_file);
    return true;
}

bool open()
{
    char sFileText[1024];
    char sFileName[12];
    char sFileGameSettingsIni[80];

    sprintf(sFileName, "save_game.ini");



    GetCurrentDirectory(512, sFileGameSettingsIni); 

    sprintf(sFileGameSettingsIni, "%s\\%s", sFileGameSettingsIni, sFileName);

    sp_loop = GetPrivateProfileInt("settings", "sp_loop", 512, sFileGameSettingsIni);

    raum = GetPrivateProfileInt("settings", "raum", 512, sFileGameSettingsIni);
    tor402 = GetPrivateProfileInt("settings", "tor402",512, sFileGameSettingsIni);
    wegiSelect = GetPrivateProfileInt("settings", "wegiSelect", 512, sFileGameSettingsIni);
    wegweiser = GetPrivateProfileInt("settings", "wegweiser", 512, sFileGameSettingsIni);
    light = GetPrivateProfileInt("settings", "light", 512, sFileGameSettingsIni);
    open_door = GetPrivateProfileInt("settings", "open_door",512, sFileGameSettingsIni);
    messer = GetPrivateProfileInt("settings", "messer", 512, sFileGameSettingsIni);
    messerwurf = GetPrivateProfileInt("settings", "messerwurf", 512, sFileGameSettingsIni);
    kamera = GetPrivateProfileInt("settings", "kamera", 512, sFileGameSettingsIni);
    stein = GetPrivateProfileInt("settings", "stein", 512,sFileGameSettingsIni);
    alive = GetPrivateProfileInt("settings", "alive", 512,sFileGameSettingsIni);
    pfeil = GetPrivateProfileInt("settings", "pfeil", 512, sFileGameSettingsIni);
    luke = GetPrivateProfileInt("settings", "luke", 512,  sFileGameSettingsIni);
    kuehlschrank = GetPrivateProfileInt("settings", "kuehlschrank", 512, sFileGameSettingsIni);
    pulver_schmand = GetPrivateProfileInt("settings", "pulver_schmand", 512, sFileGameSettingsIni);
    teddy = GetPrivateProfileInt("settings", "teddy", 512, sFileGameSettingsIni);
    seil = GetPrivateProfileInt("settings", "seil", 512, sFileGameSettingsIni);
    giftklinge = GetPrivateProfileInt("settings", "giftklinge",512, sFileGameSettingsIni);

    return true;
}

Ответы [ 3 ]

1 голос
/ 12 января 2012

Вы определяете sFileName как sFileName[12] и затем пытаетесь записать в него 14 байтов (13 и NULL). Также похоже, что буфер, который вы передаете GetCurrentDirectory(), недостаточно велик. Вы заявляете, что размер буфера составляет 512 байт, когда вы определяете его как ширину 80 символов.

Возвращаемое значение GetCurrentDirectory() сообщит вам, насколько большим должен быть буфер.

1 голос
/ 12 января 2012

Возможная причина - неправильное использование GetCurrentDirectory :

char sFileDirectory[80];

GetCurrentDirectory(512, sFileDirectory);

Это говорит о том, что sFileDirectory может содержать максимум 512 символов: он может содержать не более 80 символов (включая терминатор NULL), поэтому это может легко записать после конца sFileDirectory.

Изменить на:

GetCurrentDirectory(sizeof(sFileDirectory) - 1, sFileDirectory); /* Check the return value. */

Он может работать на вашем ПК из-за более короткого текущего каталога, где на другом ПК он может храниться в каталоге с путем, превышающим 79 символов.

Другая проблема:

char sFileName[12];

sprintf(sFileName, "save_game.ini");

«save_game.ini» имеет длину 13 символов. Изменить на:

char sFileName[14];

sprintf(sFileName, "save_game.ini");

или

const char* sFileName = "save_game.ini";

Также рассмотрите возможность использования _snprintf вместо sprintf.

0 голосов
/ 12 января 2012

sFileDirectory - это довольно мало по сравнению с размером буфера для GetCurrentDirectory. Попытайтесь enlanrge, чтобы соответствовать тому же размеру. Это, вероятно, отличается на машине выпуска.

...