strict_gs_check
pragma
此 pragma 提供了增强的安全检查。
语法
#pragma strict_gs_check(
[push,
] {on
|off
})
#pragma strict_gs_check( pop )
注解
指示编译器在函数堆栈中插入随机 Cookie 以帮助检测基于堆栈的缓冲区溢出的某些类别。 默认情况下,/GS
编译器选项不会为所有函数插入 Cookie。 有关详细信息,请参阅 /GS
(缓冲区安全检查)。
使用 /GS
启用 strict_gs_check
来进行编译。
请在公开给可能有害的数据的代码模块中使用此 pragma。 strict_gs_check
是主动 pragma,应用于可能不需要此防御的函数,但它为了最大程度降低其对生成的应用程序的性能的影响而进行优化。
即使使用此 pragma,也应尽可能写入安全的代码。 也就是说,请确保代码没有缓冲区溢出。 strict_gs_check
可保护应用程序不受代码中仍然存在的缓冲区溢出的影响。
示例
在此示例中,当我们将数组复制到本地数组时会出现缓冲区溢出。 使用 /GS
编译此代码时,不会在堆栈中插入任何 Cookie,因为数组数据类型为指针。 添加 strict_gs_check
pragma 会将堆栈 Cookie 强制插入函数堆栈。
// pragma_strict_gs_check.cpp
// compile with: /c
#pragma strict_gs_check(on)
void ** ReverseArray(void **pData,
size_t cData)
{
// *** This buffer is subject to being overrun!! ***
void *pReversed[20];
// Reverse the array into a temporary buffer
for (size_t j = 0, i = cData; i ; --i, ++j)
// *** Possible buffer overrun!! ***
pReversed[j] = pData[i];
// Copy temporary buffer back into input/output buffer
for (size_t i = 0; i < cData ; ++i)
pData[i] = pReversed[i];
return pData;
}