safebuffers

Блок, относящийся только к системам Microsoft

Указывает компилятору не вставлять проверки безопасности на переполнение буфера для функции.

__declspec( safebuffers )

Заметки

Параметр компилятора /GS указывает компилятору проверять на переполнение буфера путем вставки проверок безопасности в стек. Типы структур данных, которые являются законным объектом для проверок безопасности, описываются в разделе Параметр /GS (проверка безопасности буфера). Дополнительные сведения об обнаружении переполнения буфера см. в разделе Комплексные проверки безопасности компилятора на веб-сайте MSDN.

Экспертная проверка кода вручную или внешний анализ могут показать, что функция безопасна с точки зрения переполнения буфера. В этом случае можно отключить проверки безопасности для функции, применив в ее объявлении ключевое слово __declspec(safebuffers).

Предупреждение

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

Подставляемые функции

В основной функции можно использовать ключевое слово inlining, которое позволяет вставить копию дополнительной функции. Если к функции применяется ключевое слово __declspec(safebuffers) , то обнаружение переполнения буфера для нее отключается. Однако ключевое слово inlining сказывается на ключевом слове __declspec(safebuffers) следующим образом.

Предположим, что для обеих функций задан параметр компилятора /GS, но в основной функции используется ключевое слово __declspec(safebuffers) . Структуры данных в дополнительной функции делают ее законным объектом для проверок безопасности, поэтому такие проверки в ней не отключаются. В этом случае необходимо сделать следующее:

  • Задайте для дополнительной функции ключевое слово __forceinline, чтобы компилятор подставил эту функцию невзирая на оптимизации компилятора.

  • Поскольку дополнительная функция является законным объектом для проверок безопасности, то они будут выполняться также и над основной функцией, даже если в ней указано ключевое слово __declspec(safebuffers) .

Пример

В следующем примере кода демонстрируется применение ключевого слова __declspec(safebuffers) .

// compile with: /c /GS
typedef struct {
    int x[20];
} BUFFER;
static int checkBuffers() {
    BUFFER cb;
    // Use the buffer...
    return 0;
};
static __declspec(safebuffers) 
    int noCheckBuffers() {
    BUFFER ncb;
    // Use the buffer...
    return 0;
}
int wmain() {
    checkBuffers();
    noCheckBuffers();
    return 0;
}

Завершение блока, относящегося только к системам Microsoft

См. также

Ссылки

__declspec

Ключевые слова в C++

inline, __inline, __forceinline

strict_gs_check