Как отключить проверку безопасности буфера для функции (#pragma strict_gs_check) - PullRequest
0 голосов
/ 17 января 2019

Мне нужно отключить функцию проверки безопасности буфера (/ GS) (MSVC) для некоторых функций, но не для всего проекта, как / GS-выполнение. Документация MSVSC https://docs.microsoft.com/en-us/cpp/preprocessor/strict-gs-check?view=vs-2017 предлагает использовать #pragma strict_gs_check (off). К сожалению, это не работает для меня - я все еще вижу «куки» в сборке. Любая помощь, пожалуйста.

Это самый простой код для воспроизведения, ссылка на это здесь: 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

1 Ответ

0 голосов
/ 17 января 2019

Я не думаю, что вы можете отключить его таким образом. Строгая проверка GS - это запрос к компилятору добавить более строгие проверки к функциям, которые в противном случае не имели бы его.

Другими словами, /GS контролирует , выполнена ли проверка буфера GS, и прагма просто контролирует насколько агрессивно это.

Если вы хотите полностью отключить его для определенной функции, вы должны использовать __declspec(safebuffers) в указанной функции (см. https://docs.microsoft.com/en-us/cpp/cpp/safebuffers?view=vs-2017). Это признак того, что вы вообще не хотите проверять.

...