避免sprintf目标缓冲区溢出
3 评论82次阅读2010.04.26 19:18; 作者:Felicia
如果为sprintf准备的缓冲区大小不足,那么有可能导致缓冲区溢出后改写其他区域,这是非常危险的。
我目前的解决方案是用snprintf计算出目标缓冲区大小,然后分配一个合适的缓冲区,再打印进去。
代码如下:
//字符串后面有个\0,所以要在snprintf计算出来的长度上加1
int buf_len = snprintf(NULL, 0, format, foo, bar) + 1;
char *buf = (char *)malloc(buf_len);
sprintf(buf, format, foo, bar);
do_somthing();
free(buf);
int buf_len = snprintf(NULL, 0, format, foo, bar) + 1;
char *buf = (char *)malloc(buf_len);
sprintf(buf, format, foo, bar);
do_somthing();
free(buf);
发表回复

felix021 | 1F
八月 22nd, 2010 at 19:18
要是在多线程环境下foo/bar被修改了呢?第三行代码还是用snprintf比较好。
Felicia | 2F
九月 23rd, 2010 at 16:10
如果foo/bar被修改了,那么实际上是一个逻辑错误(这段代码就是想打印foo/bar到缓冲区)。既然已经有逻辑错误,与其使用snprintf限制溢出而不让问题暴露出来,倒不如直接让程序崩溃,这样反而更容易找到问题。
felix021 | 3F
十月 13th, 2010 at 17:41
问题是溢出之后很可能不在当前表现出异样,而在之后的某个未知时刻表现,而且很难溯源。