避免sprintf目标缓冲区溢出
3 评论102次阅读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);
Linux 内核使用的 GNU C 扩展
1个评论13次阅读2008.07.02 15:26 作者:Felicia 编辑
[阅读更多]
GNU C 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持 GNU 扩展的 C 语言称为 GNU C。
Linux 内核代码使用了大量的 GNU C 扩展,以至于能够编译 Linux 内核的唯一编译器是 GNU CC,以前甚至出现过编译 Linux 内核要使用特殊的 GNU CC 版本的情况。本文是对 Linux 内核使用的 GNU C 扩展的一个汇总,希望当你读内核源码遇到不理解的语法和语义时,能从本文找到一个初步的解答,更详细的信息可以查看gcc.info。文中的例子取自 Linux 2.4.18。
(全文 …)
