3

我们使用的静态分析工具将类似于以下的 C 代码标记为严重缓冲区溢出。

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

该工具的错误信息是: Buffer Overflow (Array Index Out of Bounds): The array 'buf' size is 1. Array 'buf' may use the 0..64 index。

这是合法的吗?将字符数组分配给空字符串是否真的导致其长度减少到单个字节,就好像它被定义为一样char buf [] = "";

4

4 回答 4

12

除了 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);

我相信 Rob Kennedy 是正确的;您的工具使用空字符串初始值设定项作为数组大小,而不是静态数组声明。

于 2009-02-16T15:40:25.833 回答
5

将 "" 分配给 buf[size+1] 不会重置 buf 的大小,但它没有意义,因为它复制了后续 memset 所做的一小部分(并且它混淆了您的静态分析工具 - 您可能想要归档针对它的错误报告)。

于 2009-02-17T01:38:07.053 回答
4

这不是缓冲区溢出。

这可能是一种更清洁的方法。当然它需要更少的代码行。

#define size 64
char buf[size + 1] = {0};
于 2009-02-17T02:06:19.170 回答
0

这是合法的 - 缓冲区足够大。该工具警告您 size_t 可能大于 int 并且尝试将其用作索引器可能会导致不可预测的结果。

于 2009-02-16T15:44:21.427 回答