sprintf为什么有安全隐患

来源:互联网 发布:初音未来mmd动作数据 编辑:程序博客网 时间:2024/04/29 14:40

先来看一小段代码

#include <stdio.h>int main(){char buf[12] = {0};char *str = "ab";sprintf(buf, "hello :%s\n", str);printf("%s\n", buf);return 0;}

编译并运行以上程序,会打印输出

hello :ab

然而,当把程序改成

#include <stdio.h>int main(){char buf[12] = {0};char *str = "abcdefgh";sprintf(buf, "hello :%s\n", str);printf("%s\n", buf);return 0;}

再编译运行,程序可以正常编译,但是当运行程序时,程序就会终止,并报错

Abort trap: 6
说明sprintf函数是存在安全隐患的,可能当编写程序时,str变量可能会保存不同的内容,而且有很大可能出现上述安全隐患,

因此推荐使用sprintf安全改进版snprintf函数。

继续上边的例子

<pre name="code" class="plain">#include <stdio.h>int main(){char buf[12] = {0};char *str = "abcdefgh";snprintf(buf, sizeof(buf), "hello :%s\n", str);printf("%s\n", buf);return 0;}

对其中的参数做一下说明,第一个为目标字符串,第二个目标字符串的长度,第三个为原串。

安全性体现在哪里呢?第二个参数。

当要存储的字符串长度大于目标字符串长度时,会只保存目标串长度-1长度的字符串,并在末尾补\0字符串结束符。因此无论对str字符串作何处理,当使用snprintf时都能确保程序可以正常运行,从而提高程序的健壮性,不至于崩溃退出。


至于sprintf源代码细节有待进一步研究。

0 0