safebuffers
Microsoft 专用
通知编译器不要插入缓冲区溢出功能的安全检查。
__declspec( safebuffers )
备注
/GS 编译器选项导致编译器测试缓冲区溢出通过插入堆栈上的安全检查。 的数据结构的类型可以进行安全检查在 /GS(缓冲区安全检查)所述。 有关缓冲区溢出检测的更多信息,请 Compiler Security Checks In Depth 参见 MSDN 网站上。
一个 " 专家的手动代码评审或外部分析可能确定函数从缓冲区溢出是安全的。 在这种情况下,可以通过应用declspec(safebuffers) 关键字禁止显示功能的安全检查于函数声明。
警告
缓冲区安全检查提供严重的安全保护并且在性能的一个忽略的影响。因此,建议您不要禁止显示它们,但在函数性能非常重要问题的极少数情况下,函数了解是安全的。
内联函数
一种 主要功能 可以使用 内联 关键字插入一个 辅助功能的副本。 如果declspec(safebuffers)关键字是否应用于函数,缓冲区溢出检测为该函数被取消。 但是,内联下列方面影响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 的结尾