这真的是缓冲区溢出吗?

时间:2009-02-16 15:36:48

标签: c static-analysis buffer-overflow string-literals

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

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

该工具的错误消息是:缓冲区溢出(数组索引超出界限):数组'buf'大小为1.数组'buf'可能使用0..64索引。

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

4 个答案:

答案 0 :(得分: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是正确的;您的工具使用空字符串初始值设定值作为数组大小而不是静态数组声明。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

这不是缓冲区溢出。

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

#define size 64
char buf[size + 1] = {0};

答案 3 :(得分:0)

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