关于 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”) 版本。
有关详细信息,请参阅以下部分。
字符计数函数
以下函数使用字符计数而不是字节计数。
函数 | 取代 |
---|---|
, | |
字节计数函数
以下函数使用字节计数而不是字符计数。
函数 | 取代 |
---|---|
使用 Strsafe.h
若要内联使用 Strsafe 函数,请在所有其他头文件的 #include 语句后面包含头文件,如下所示。
#include <strsafe.h>
若要在库窗体中使用函数,请在包含 Strsafe.h 之前包括以下语句。 但是,建议使用内联函数。
#define STRSAFE_LIB
注意
:以下函数必须用作内联函数: StringCbGets、 StringCbGetsEx、 StringCchGets 和 StringCchGetsEx。
在文件中包含 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_FUNCTIONS 或 STRSAFE_NO_CCH_FUNCTIONS,但不能同时定义两者。
某些 Strsafe 函数具有区域设置感知版本。 默认情况下, 标头不声明这些函数。 若要启用这些声明,请在包含 Strsafe.h 之前包括以下宏语句。
#define STRSAFE_LOCALE_FUNCTIONS
支持的最大字符串长度为 2,147,483,647 (STRSAFE_MAX_CCH) 个字符(ANSI 或 Unicode)。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈