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

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

Необработанное исключение в 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;
}

1 ответ

Решение

В

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() чтобы получить это.

Другие вопросы по тегам