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

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

Необработанное исключение в 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() чтобы получить это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]