【发布时间】:2011-12-12 17:21:00
【问题描述】:
我知道 SO 上已经有一个类似标题的问题,但我想知道我对这个特定案例的选择。
MSVC 编译器给出关于 strcpy 的警告:
1>c:\something\mycontrol.cpp(65): warning C4996: 'strcpy': This function or
variable may be unsafe. Consider using strcpy_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
这是我的代码:
void MyControl::SetFontFace(const char *faceName)
{
LOGFONT lf;
CFont *currentFont = GetFont();
currentFont->GetLogFont(&lf);
strcpy(lf.lfFaceName, faceName); <--- offending line
font_.DeleteObject();
// Create the font.
font_.CreateFontIndirect(&lf);
// Use the font to paint a control.
SetFont(&font_);
}
注意font_ 是一个实例变量。 LOGFONT 是一个窗口结构,其中lfFaceName 定义为TCHAR lfFaceName[LF_FACESIZE]。
我想知道的是我可以做如下的事情(如果不是为什么不这样做):
void MyControl::SetFontFace(const std::string& faceName)
...
lf.lfFaceName = faceName.c_str();
...
或者如果有完全不同的选择,请告诉我。
【问题讨论】:
-
你可以忽略这个警告,strcpy 没有被弃用。在您的设置中永久定义
_CRT_SECURE_NO_WARNINGS并完成它。 -
strcpy 的危险在于,如果源字符串不是以 NULL 结尾的,或者比目标缓冲区长,您将得到缓冲区溢出 - 这是最常见的安全漏洞来源之一C/C++ 代码。 strcpy_s 还获取目标缓冲区的大小,并保证成功完成后,目标缓冲区将空终止。
-
strncpy更便携,同样安全。 -
@MooingDuck,
strncpy的问题在于它被破坏了:如果它必须截断它不会空终止。所以最好使用一个总是在最后添加零的快速包装器。