关于函数snprintf的缺陷探讨

int snprintf(char *str, size_t size, const char *format, ...);

最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。
函数返回值: 若成功则返回存入数组的字符数,若编码出错则返回负值。

snprintf 规定了写入str的最大字节数,防止缓冲区溢出。

如果能够正确使用snprintf是不会出问题的,因为它自身有越界检查。可是,在作者所在的公司里,有些代码采用了以下的使用方法,就出问题了:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
    char str1[10];
    memset(str1,0x00,sizeof(str1));

    snprintf(str1,sizeof(str1),"acbf%aaaabcbbbbcccc");
    printf("str1:%s\n",str1);
    return 0;
}

输出:str1:acbf0x1.0

这里只是个简单的例子做说明。出现这个问题的条件有两个:一、特殊字符%;二、snprintf没有加 const char *format,这个参数。在上述简单例子中,如果snprintf这样使用:snprintf(str1,sizeof(str1),"%s","acbf%aaaabcbbbbcccc");是不会出现该问题的。

在一大推代码中,如果有snprintf这样使用,容易出现字符串被截断的现象,作者从事的代码中就有这样的问题出现,修改的方法就是用strncpy来替换。

你们遇上过这个情况了吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值