博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sprintf和snprintf的正确使用
阅读量:7010 次
发布时间:2019-06-28

本文共 686 字,大约阅读时间需要 2 分钟。

hot3.png

关于sprintf和snprintf的正确使用
考虑以下有缺陷的例子:
void f(const char *p)
{
    char buf[11]={0};
    sprintf(buf,"%10s",p); // very dangerous
    printf("%sn",buf);
}
不要让格式标记“%10s”误导你。如果p的长度大于10个字符,那么sprintf() 的写操作就会越过buf的边界,从而产生一个缓冲区溢出。
检测这类缺陷并不容易,因为它们只在 p 的长度大于10个字符的时候才会发生。黑客通常利用这类脆弱的代码来入侵看上去安全的系统。
要修正这一缺陷,可以使用函数snprintf()代替函数sprintf()。
函数原型:int snprintf(char *dest, size_t n, const char *fmt, ...);
函数说明: 最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。
函数返回值: 若成功则返回存入数组的字符数,若编码出错则返回负值。
推荐的用法:
void f(const char *p)
{
    char buf[11]={0};
    snprintf(buf, sizeof(buf), "%10s", p); // 注意:这里第2个参数应当用sizeof(str),而不要使用硬编码11,也不应当使用sizeof(str)-1或10
    printf("%sn",buf);
}

转载于:https://my.oschina.net/cwdong8/blog/76284

你可能感兴趣的文章
文件上传---动作条
查看>>
自制CA签发证书
查看>>
解决mysql “too many connections”
查看>>
梳理下MySQL崩溃恢复过程
查看>>
红包金额均分实现
查看>>
Google校园招聘题 -- 程序员买房
查看>>
线程的属性(优先级、守护线程、未捕获异常处理器)
查看>>
oracle批量插入测试数据
查看>>
goahead-3.6.2-src 移植到linux
查看>>
Mysql数据库调优和性能优化的21条最佳实践
查看>>
iOS视频播放-MPMoviePlayerController
查看>>
mysql导入导出数据中文乱码解决方法小结
查看>>
使用Mob短信sdk遇到的问题,解决
查看>>
android-------- 强引用、软引用、弱引用、虚引用使用
查看>>
HTML标签marquee实现滚动效果
查看>>
html字符操作
查看>>
oracle函数
查看>>
百度贴吧爬虫1.0
查看>>
ant+jmeter接口批量执行测试用例
查看>>
Mongodb
查看>>