CRT中的安全功能
许多旧 CRT 函数具有较新,更安全版本。 如果一个安全功能存在,旧,较不安全版本标记为已弃用,并新版本具有 _s (“安全”) 后缀。
在此上下文中, “已否决”意味着不建议使用函数;它不指示功能安排从 CRT 中移除。
安全功能不阻止或右边的安全错误;相反,那么,当事件发生时,他们将无法看到错误。 它们执行进一步的检查错误状态,并且,对于错误,它们调用错误处理程序 (请参见 参数验证)。
例如, strcpy 功能无法调用字符串复制它是否为其目标缓冲区太大。 但是,其安全副本, strcpy_s,采用缓冲区的大小作为参数,因此,它可以确定缓冲区溢出是否将导致。 如果使用 strcpy_s 复制为一个字符为十六进制字符缓冲区,这是在部分的错误; strcpy_s 不能更正此错误,但是,它可以检测该错误并将调用无效参数处理程序通知您。
消除否决警告。
可通过多种方式消除早期,不够安全功能的否决警告。 最简单的形式是定义 _CRT_SECURE_NO_WARNINGS 或使用 warning 说明。 用于将禁用否决警告,当然,但安全问题导致警告仍存在。 将否决警告启用和利用新的 CRT 安全功能最好。
在 C++ 中,是使用的最简单的方法执行 安全模板重载,将通过替换在许多情况下消除否决警告调用弃用的功能与调用这些功能的新版本。 例如,请考虑此弃用的调用 strcpy:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
定义 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 为 1 通过更改 strcpy 消除该警告调用 strcpy_s,避免缓冲区溢出。 有关更多信息,请参见 安全模板重载。
对于没有安全模板重载的那些已弃用的功能,则应显式考虑手动更新代码使用安全版本。
否决警告的另一个源,不相关与安全,是 POSIX 功能。 使用它们的标准等效替换 POSIX 函数名称 (例如,若要 _access的更改 访问 ),或者通过定义 _CRT_NONSTDC_NO_WARNINGS禁用 POSIX 相关的否决警告。 有关更多信息,请参见 Deprecated CRT Functions。
其他安全功能
某些安全功能包括:
Parameter Validation. 参数传递给 CRT 函数在两个验证,获取函数和函数中的许多预先存在的版本。 这些验证包括:
检查 NULL 值传递给函数。
检查枚举值的有效性。
检查整数值在有效范围内。
有关更多信息,请参见 参数验证。
无效参数的处理程序对开发人员也是可访问的。 当遇到无效参数,而不是断言并退出应用程序, CRT 时提供一种检查 _set_invalid_parameter_handler 的这些问题函数。
Sized Buffers. 安全功能需要缓冲区大小向该的所有功能到缓冲区中编写。 安全版本验证缓冲区中编写足以对之前,有助于避免风险缓冲区溢出可以使恶意代码执行的错误。 ,如果缓冲区的大小太小,这些函数通常返回错误代码的 errno 类型并调用无效参数处理程序。 从输入缓冲区读取,例如 gets的功能,但需要指定最大大小的安全版本。
Null termination. 保留而非终止的字符串的某些函数具有相应的安全版本正确 null 终止的字符串。
Enhanced error reporting. 安全功能比预先存在的函数返回与多个错误信息的错误代码可用。 安全功能和许多预先存在的功能现在设置的 errno 和通常返回 errno 代码类型,可提供更好的错误报告。
Filesystem security. 获取文件 I/O API 支持获取在默认情况下的文件访问。
Windows security. 保护处理 API 强制安全策略并允许指定 ACL。
Format string syntax checking. 使用错误类型在printf 格式字符串的字段,字符无效字符串被检测,例如,。