关于 Strsafe.h

糟糕的缓冲区处理与涉及缓冲区溢出的许多安全问题有关。 Strsafe.h 中定义的函数提供额外的处理,以便在代码中进行适当的缓冲区处理。 因此,它们旨在替换其内置的 C/C++ 对应项以及特定的 Windows 实现。 从 Windows XP Service Pack 2 (SP2) 开始,Windows SDK 中提供了 Strsafe.h。

Strsafe 函数的优点包括:

  • 始终向函数提供目标缓冲区的大小,以确保函数不会写入缓冲区末尾。

  • 即使操作截断了预期结果,缓冲区也保证以 null 结尾。

  • 所有函数都返回 HRESULT 值,只有一个可能的成功代码 (S_OK) 。

  • 每个函数都提供相应的字符计数 (“cch”) 或字节计数 (“cb”) 版本。

  • 大多数函数都有可用于高级功能的扩展 (“Ex”) 版本。

有关详细信息,请参阅以下部分。

字符计数函数

以下函数使用字符计数而不是字节计数。

函数 取代
StringCchCat
StringCchCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCchCatN
StringCchCatNEx
strncat
StrNCat
StringCchCopy
StringCchCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
StrCpy
StringCchCopyN
StringCchCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCchGets
StringCchGetsEx
获取、_getws、_getts
StringCchPrintf
StringCchPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCchVPrintf
StringCchVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
,
StringCchLength
strlen、wcslen、_tcslen

 

字节计数函数

以下函数使用字节计数而不是字符计数。

函数 取代
StringCbCat
StringCbCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCbCatN
StringCbCatNEx
strncat
StrNCat
StringCbCopy
StringCbCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
StrCpy
StringCbCopyN
StringCbCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCbGets
StringCbGetsEx
获取、_getws、_getts
StringCbPrintf
StringCbPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCbVPrintf
StringCbVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
StringCbLength
strlen、wcslen、_tcslen

 

使用 Strsafe.h

  • 若要内联使用 Strsafe 函数,请在所有其他头文件的 #include 语句后面包含头文件,如下所示。

    #include <strsafe.h>

  • 若要在库窗体中使用函数,请在包含 Strsafe.h 之前包括以下语句。 但是,建议使用内联函数。

    #define STRSAFE_LIB

    注意

    :以下函数必须用作内联函数: StringCbGetsStringCbGetsExStringCchGetsStringCchGetsEx

     

  • 在文件中包含 Strsafe.h 时,由 Strsafe.h 函数替换的旧函数将弃用。 尝试使用这些旧函数将导致编译器错误,告知你使用较新的函数。 如果要重写此行为,请在包含 Strsafe.h 之前包含以下语句。

    #define STRSAFE_NO_DEPRECATE

  • 若要仅允许字符计数函数,请在包含 Strsafe.h 之前包括以下语句。

    #define STRSAFE_NO_CB_FUNCTIONS

  • 若要仅允许字节计数函数,请在包含 Strsafe.h 之前包括以下语句。

    #define STRSAFE_NO_CCH_FUNCTIONS

    注意

    可以定义 STRSAFE_NO_CB_FUNCTIONSSTRSAFE_NO_CCH_FUNCTIONS,但不能同时定义两者。

     

  • 某些 Strsafe 函数具有区域设置感知版本。 默认情况下, 标头不声明这些函数。 若要启用这些声明,请在包含 Strsafe.h 之前包括以下宏语句。

    #define STRSAFE_LOCALE_FUNCTIONS

  • 支持的最大字符串长度为 2,147,483,647 (STRSAFE_MAX_CCH) 个字符(ANSI 或 Unicode)。

Strsafe 函数