Iur*_*nko 4 security buffer local disable
我需要对某些功能抑制缓冲区安全检查 (/GS) 功能 (MSVC),但不能像 /GS 那样对整个项目抑制。MSVSC 文档https://learn.microsoft.com/en-us/cpp/preprocessor/strict-gs-check?view=vs-2017提示使用 #pragma strict_gs_check(off)。不幸的是,它对我不起作用 - 我仍然在程序集中看到“cookie”。请提供任何帮助。
这是最简单的复制代码,这里有大胆的链接:https ://godbolt.org/z/gYiGam
#include <memory>
struct Tmp {
char v[8];
};
//#pragma check_stack(off)
#pragma strict_gs_check(off)
int make1(Tmp& a)
{
Tmp r;
return memcmp(&r, &a, sizeof(r));
}
//result
//-------------------------
pop esi
mov ecx, DWORD PTR __$ArrayPad$[esp+12]
xor ecx, esp
call @__security_check_cookie@4
add esp, 12 ; 0000000cH
ret 0
$LN6@make1:
mov ecx, DWORD PTR __$ArrayPad$[esp+16]
sbb eax, eax
pop esi
xor ecx, esp
or eax, 1
call @__security_check_cookie@4
add esp, 12 ; 0000000cH
ret 0
int make1(Tmp &) ENDP ; make1
Run Code Online (Sandbox Code Playgroud)
我不认为你可以通过这种方式禁用它。严格的 GS 检查是要求编译器向原本没有检查的函数添加更严格的检查。
换句话说,/GS控制是否完成 GS 缓冲区检查,而编译指示仅控制其激进程度。
如果您想针对特定功能完全禁用它,则应该__declspec(safebuffers)在该功能上使用(请参阅
https://learn.microsoft.com/en-us/cpp/cpp/safebuffers?view=vs-2017)。这表明您根本不想进行检查。