1. str 系列的安全函数
例如,strcpy() 的安全函数是 strcpy_s(),strcat() 的安全函数是 strcat_s()。安全函数与原函数相比,函数原型发生了改变。如下图所示,安全函数的返回值是 error_t 类型,而并非原函数的 char* 类型。
error_t 本质上是 int,不同数值代表不同错误种类。如果是 0,代表程序运行正常;如果非 0,则代表程序运行错误,可以利用 perror 查看错误种类。代码如下:可以发现 error 值为 34,说明程序运行失败,错误原因为 result too large,即待拷贝的字符串过大。
void TestPerror(){
char des[2];
// 第一个参数为目标字符串,第二个参数为目标字符串的容量,第三个参数是待拷贝的字符串
int error_no = strcpy_s(des, 2, "Hello");
printf("error: %d\n", error_no);
if(error_no){ // 程序运行不成功,error_no 非 0
perror("strcpy_s returns:");
}
}
2. 安全函数的使用限制
并非每种编译器都支持安全函数,所以在使用安全函数前,需要利用宏判断当前编译器是否支持。代码如下,如果编译器支持安全函数,则编译器内部一定定义了宏 __STDC_WANT_LIB_EXT1__,会输出 "support C11 safe version.",此时安全函数才可使用。如果不支持,安全函数便不可用。
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
#ifdef __STDC_WANT_LIB_EXT1__
puts("support C11 safe version.");
#else
puts("No support for C11 safe version.");
#endif
// TestPerror();
return 0;
}