慎用sprintf,易造成缓冲区溢出

时间:2022-08-30 06:58:14

案例:

 一个组员写了一个函数,碰到一个奇怪的问题,前面定义了一个字符串,后面根本没有修改他,但里面的值却不知什么时候被修改掉了。

凭感觉和经验,字符串处理,造成内容被修改,10有89是缓冲区溢出造成的。于是帮忙看了下代码。其代码类似于:


char buf1[10] = "123456789";
char buf2[10] = {0};
char buf3[19] = "--abcdefghijklmn--";
sprintf(buf2, "test:%send", buf3);

通过跟踪发现,sprintf后,buf1就被改变了。原因很简单,sprintf不是类型安全的,在执行的时候,它不会检查数组边界。所以当给其格式化一个比其大小还长的字符串时,就导致缓冲区溢出了。
在回到buf1为啥改变。由于堆栈里定义的临时变量,都是从高往下分配的,先定义的在地位,后定义的在紧连着的高位,所以很明显,buf2溢出部分,就把buf1的数据给覆盖了,见一下内存截图:
  慎用sprintf,易造成缓冲区溢出

可以看到,由于buf2溢出,buf1的数据确实被覆盖了。