sprintf为什么有安全隐患

先来看一小段代码

#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源代码细节有待进一步研究。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值