这真的是缓冲区溢出吗?
-
23-08-2019 - |
题
我们使用的静态分析工具将类似于以下内容的 C 代码标记为严重缓冲区溢出。
#define size 64
char buf [size + 1] = "";
memset (buf, 0, size + 1);
该工具的错误消息是: 缓冲区溢出 (数组索引越界):数组“buf”大小为 1。数组“buf”可以使用 0..64 索引。
这是合法的吗?将字符数组分配给空字符串是否真的会导致其长度减少到单个字节,就好像它被定义为一样 char buf [] = "";
?
解决方案
将“”分配给 buf[size+1] 不会重置 buf 的大小,但它是没有意义的,因为它复制了后续 memset 所做的一小部分(并且它使您的静态分析工具感到困惑 - 您可能想要归档针对它的错误报告)。
其他提示
除了 char buf[size+1] 由于 size 是运行时值而无法编译这一事实之外,假设您可以将 buf 构建为大小为 65 的数组,那么 memset(buf, 0, 65) 不会溢出。
您的工具很可能会因语法问题而感到困惑。
[编辑:更多信息]
根据对我原来帖子的评论,我建议如下:
#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);
我相信罗布·肯尼迪是正确的;您的工具使用空字符串初始值设定项值作为数组大小,而不是静态数组声明。
这不是缓冲区溢出。
这可能是一种更干净的方法。当然,它需要更少的代码行。
#define size 64
char buf[size + 1] = {0};
这是合法的——缓冲区足够大。该工具警告您 size_t 可能大于 int ,尝试将其用作索引器可能会导致不可预测的结果。
不隶属于 StackOverflow