安全模板重载
许多 CRT 函数是否决了较新,增强了安全性的版本 (例如, strcpy_s 是 strcpy的更安全的替换)。CRT 提供模板重载有助于缓解用更安全的变量的转换。
例如,在中,因为 strcpy 已弃用,此代码生成警告:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
您可以忽略此警告。定义符号 _CRT_SECURE_NO_WARNINGS 禁止显示警告或更新代码使用 strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
模板重载提供附加的选择。定义 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 到 1 允许自动调用更安全的变量标准 CRT 函数的模板重载。如果 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 为 1,则对代码的更改是必需的。在后台,对 strcpy 的调用会更改为。 strcpy_s 的调用与自动所提供的范围参数。
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 不影响采用计数的功能,例如 strncpy。若要启用计数功能的模板重载,请定义 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 到 1。,但是,在执行前因此请确保该代码通过计数字符,缓冲区 (一个常见的错误) 不属于范围。此外,显式编写 null 结束符缓冲区末尾的代码,在函数调用之后不是必需的,如果安全变量调用。如果需要截断行为,请参见 _TRUNCATE。
说明 |
---|
宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 需要 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 还定义为 1。如果 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 定义, 1 和 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 定义为 0,应用程序将不会执行任何模板重载。 |
定义 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 到 1 允许安全变体 (以 “_s”名称) 的模板重载。在这种情况下,因此,如果 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 为 1,那么一个少量更改必须对原始代码:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
需要更改函数的名称 (通过将 “_s”);模板重载负责提供范围参数。
默认情况下, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 和 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 定义, (禁用的) 0,并 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 定义为 1 (已启用)。
注意这些模板重载为静态数组只有。动态分配的缓冲区需要额外的源代码更改。重新访问上面的示例:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; have to change to
// strcpy_s(szBuf, 10, "test");
这样:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; have to change to
// strcpy_s(szBuf, 10, "test");