安全模板重载

许多 CRT 函数是否决了较新,增强了安全性的版本 (例如, strcpy_sstrcpy的更安全的替换)。 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");

请参见

参考

CRT库功能

概念

CRT中的安全功能