一、strcpy()简介
1. 函数原型
char *strcpy(char* dest, const char *src);
2. 参数
- dest—指向用于存储复制内容的目标数组。
- src—要复制的字符串。
3. 功能
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
4. 头文件
#include <string.h>
#include <stdio.h>
5. 返回值
返回指向dest的指针。
二、strcpy()用法
strcpy()函数可以用来给数组赋值。
具体代码如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
char temp[20];
strcpy(temp,"MQ=0522");
printf("%s\n",temp);
return 0;
}
运行结果如下:
MQ=0522
三、缓冲区溢出问题和防范
C 语言和 C++语言风格轻松、灵活,语法限制宽松,因而受到各类程序员的欢迎,是比较通用的编程语言,同时也是各大院校计算机专业的基本语言课程。strcpy 函数由于不对数组边界进行检查,而非常容易造成各种缓冲区溢出的漏洞。这些漏洞很容易被利用,而造成严重的系统问题。在使用 strcpy 函数时,要小心谨慎。
以下就 Strcpy 函数中的缓冲区溢出问题和防范进行讨论。
缓冲区溢出问题
缓冲区的溢出就是程序在动态分配的缓冲区中写入了太多的数据,使这个分配区发生了溢出。一旦一个缓冲区利用程序能将运行的指令放在有 root权限的内存中,运行这些指令,就可以利用 root 权限来控制计算机了。
strcpy()函数安全编码
在编程时,加入错误检查,就可及时发现错误,并且对出现的异常进行处理。在编写 strcpy 函数时,首先尽量使目的缓冲区长度足够长,另外要检测目的缓冲区和源缓冲区。如果目的缓冲区或源缓冲区是空,就要在异常处理中结束程序。如果,源字符串比目的缓冲区长度不长,也要在异常处理中结束程序,以防止出现溢出情况。任何程序都很难说是绝对安全,只能以尽可能安全的方式来处理 strcpy 函数。只要输入的字符串不以空字符结束,函数就会随时终止。这种检测容易实现。但是这样的检测也并不能确定函数一定安全。
另外,每添加一个错误检查,就会使程序更复杂,而且可能产生很多的 bug,增加很多的工作量。最重要的是,即使设计程序时非常仔细,也有可能会忽略一些细节问题,导致不可弥补的错误。所以,在编写程序时,最安全的方法,就是尽可能不去使用 strcpy 函数。可以在程序的开头加上 #define strcpy Unsafe_strcpy。这样,就会使 strcpy 函数在编译时产生错误,从而使我们在编程时可以完全摒弃strcpy 函数。在完全丢弃 strcpy 函数的同时,也就丢掉了众多依附于 strcpy 函数的 bug。