Переполнение буфера на основе стека

При запуске моего кода я получаю следующую ошибку:

Необработанное исключение по адресу 0x00BA16A0 в GameLauncher.exe: код инструментария cookie стека обнаружил переполнение буфера стека.

Я понятия не имею, что может быть причиной этого. Это вызывается следующим кодом:

#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>

int main()
{

    std::cout << "Which process would you like to close? (Include .exe)" << std::endl;
    wchar_t userProcessToFind;
    std::wcin.getline(&userProcessToFind, 20);

    HANDLE processSnapshot;
    DWORD processID = 0;
    PROCESSENTRY32 processEntery;
    processEntery.dwSize = sizeof(PROCESSENTRY32);

    processSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processID);
    if(Process32First(processSnapshot, &processEntery) == TRUE)
    { 

        while (Process32Next(processSnapshot, &processEntery) == TRUE)
        {
            if (_wcsicmp(processEntery.szExeFile, &userProcessToFind) == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntery.th32ProcessID);

                TerminateProcess(hProcess, 0);

                CloseHandle(hProcess);
            }
        }

        CloseHandle(processSnapshot);
    }

    return 0;
}

person KingRaider    schedule 03.10.2015    source источник


Ответы (1)


In

wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);

Вы выделили место для одного wchar_t, но пытаетесь прочитать до 20 символов и поместить его в память по адресу userProcessToFind. Это приведет к повреждению стека, поскольку вы попытаетесь записать в память, которая не принадлежит &userProcessToFind. Что вам нужно сделать, это создать массив, например

wchar_t userProcessToFind[20];
std::wcin.getline(userProcessToFind, 20);

Или вы можете использовать std::wstring, и ваш код станет

std::wstring userProcessToFind;
std::getline(std::wcin, userProcessToFind);

Преимущество этого заключается в том, что не нужно использовать произвольный размер имени процесса, поскольку std::wstring будет масштабироваться в соответствии с входными данными. Если вам нужно передать базовый wchar_t* в функцию, вы можете использовать std::wstring::c_str() чтобы получить.

person NathanOliver    schedule 03.10.2015
comment
Спасибо большое! Я даже не думал об этом. Вы только что избавили меня от многих проблем :) - person KingRaider; 03.10.2015