我需要禁止某些功能的缓冲区安全检查(/ GS)功能(MSVC),而不是像/ GS-那样取消整个项目。 MSVSC文档https://docs.microsoft.com/en-us/cpp/preprocessor/strict-gs-check?view=vs-2017提示使用#pragma strict_gs_check(off)。不幸的是,它对我不起作用-我仍然在程序集中看到“ cookies”。请帮忙。
这是要复制的最简单的代码,请点击此处的粗体链接: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
答案 0 :(得分:2)
我认为您不能以这种方式禁用它。严格GS检查是对编译器的请求,要求编译器将 stricter 检查添加到原本没有此检查的函数中。
换句话说,/GS
控制是否进行了GS缓冲区检查,而编译指示仅控制如何具有攻击性。
如果您想完全禁用特定功能,请在该功能上使用__declspec(safebuffers)
(请参见
https://docs.microsoft.com/en-us/cpp/cpp/safebuffers?view=vs-2017)。这表明您根本不想检查。
答案 1 :(得分:1)
您可以将所有不需要检查的功能移至单个文件,然后仅对该文件使用/ GS-。 还可以查看/ RTC / RTCu / RTC1设置