如何禁用函数的缓冲区安全检查 (#pragma strict_gs_check)

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)

pax*_*blo 7

我不认为你可以通过这种方式禁用它。严格的 GS 检查是要求编译器向原本没有检查的函数添加更严格的检查。

换句话说,/GS控制是否完成 GS 缓冲区检查,而编译指示仅控制其激进程度

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