2015-10-03 199 views
1

當運行我的代碼,我得到了以下錯誤:Stackbased緩衝區溢出

Unhandled exception at 0x00BA16A0 in GameLauncher.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

我不知道這可能是導致此。它與下面的代碼引起的:

#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()來獲取它。

+0

非常感謝!我甚至都沒有想過這個。你剛剛救了我很多麻煩:) – KingRaider