VS項目在默認情況下會啓用緩衝區溢出檢查
來一個Demo
typedef struct {
int x[20];
} BUFFER;
int foo()
{
BUFFER cb;
cb.x[0] = 1;
return 0;
};
int _tmain(int argc, _TCHAR* argv[])
{
foo();
return 0;
}
foo函數的彙編代碼是這個樣子的
編譯器會檢查你的代碼,可能的話會生成一些安全代碼,比如上面的"__security_check_cookie"開頭的函數。
當然,我們可以在項目設置中徹底關閉這個安全選項,但是在某些場景下,我們可能需要打開這個功能,但是對部分特定函數則禁用它,這是可以的。
網上有些文章說用"#pragma check_stack"指令來關閉,經過測試並沒有用。
正確的應該是使用"__declspec(safebuffers)"來修飾函數,比如這樣
__declspec(safebuffers) void foo()
修飾後的的代碼就乾淨了
相關閱讀:
https://docs.microsoft.com/en-us/cpp/build/reference/gs-buffer-security-check