为特定函数关闭缓冲区溢出检查

VS项目在默认情况下会启用缓冲区溢出检查

为特定函数关闭缓冲区溢出检查_第1张图片

来一个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函数的汇编代码是这个样子的

为特定函数关闭缓冲区溢出检查_第2张图片

编译器会检查你的代码,可能的话会生成一些安全代码,比如上面的"__security_check_cookie"开头的函数。

当然,我们可以在项目设置中彻底关闭这个安全选项,但是在某些场景下,我们可能需要打开这个功能,但是对部分特定函数则禁用它,这是可以的。

网上有些文章说用"#pragma check_stack"指令来关闭,经过测试并没有用。

正确的应该是使用"__declspec(safebuffers)"来修饰函数,比如这样

__declspec(safebuffers) void foo()

修饰后的的代码就干净了


为特定函数关闭缓冲区溢出检查_第3张图片

相关阅读

https://docs.microsoft.com/en-us/cpp/build/reference/gs-buffer-security-check

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

你可能感兴趣的:(C++)