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