关于函数snprintf的缺陷探讨

来源:互联网 发布:永嘉之乱 知乎 编辑:程序博客网 时间:2024/06/07 14:42

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来替换。

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