定义如下:char *p 没有赋初始值。
然后调用snprintf(“%s”, 100, p);是否可以把字符串控制在100个字符之内呢?
答案是否定的。
笔者就遇到过。
我们可以看一下实现:
int snprintf(char * buf, size_t size, const char *fmt, ...)
=>i=vsnprintf(buf,size,fmt,args);
=>for (; *fmt ; ++fmt)//fmt没有尾结束符就一直遍历
==>if (*fmt != '%') {//定位到 %格式化
if (str < end)
*str = *fmt;
++str;
continue;
}
==>++fmt; /* this also skips first '%' *///分析%后面的格式字符是什么
==>switch (*fmt)
====>case 's':
s = va_arg(args, char *);
if ((unsigned long)s < PAGE_SIZE)
s = "<NULL>";
len = strnlen(s, precision);//计算s的长度,如果s是一个野指针,那么后果将是灾难性的,s的结尾鬼才知道,可能落在未知权限的页,结果就是数据异常访问
if (!(flags & LEFT)) {
while (len < field_width--) {
if (str < end)
*str = ' ';
++str;
}
}
for (i = 0; i < len; ++i) {
if (str < end)
*str = *s;
++str; ++s;
}
while (len < field_width--) {
if (str < end)
*str = ' ';
++str;
}
continue;