2

我需要抑制某些功能的缓冲区安全检查 (/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
4

2 回答 2

5

我认为您不能以这种方式禁用它。严格的 GS 检查是对编译器添加更严格检查的请求,否则将不会有它。

换句话说,/GS控制GS 缓冲区检查是否完成,而 pragma 只是控制的激进程度。

如果您想为特定功能完全禁用它,则应__declspec(safebuffers)在所述功能上使用(请参阅 https://docs.microsoft.com/en-us/cpp/cpp/safebuffers?view=vs-2017)。这表明您根本不想检查。

于 2019-01-17T18:02:31.620 回答
1

您可以将所有不需要检查的函数移动到一个文件中,然后仅对该文件使用 /GS-。另请查看 /RTCs /RTCu /RTC1 设置

于 2020-04-11T11:27:55.793 回答