这真的是缓冲区溢出吗?

An̲*_*rew 3 c static-analysis buffer-overflow string-literals

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

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);
Run Code Online (Sandbox Code Playgroud)

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

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

Ran*_*pho 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);
Run Code Online (Sandbox Code Playgroud)

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


dav*_*olm 5

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