避免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);

相关文章

  • 评论 (3)
  • 引用通告 (0)
发表评论 引用通告

  • 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

        问题是溢出之后很可能不在当前表现出异样,而在之后的某个未知时刻表现,而且很难溯源。

暂无引用通告