爲特定函數關閉緩衝區溢出檢查

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

https://docs.microsoft.com/en-us/cpp/cpp/safebuffers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章