当前位置:  开发笔记 > 编程语言 > 正文

这真的是缓冲区溢出吗?

如何解决《这真的是缓冲区溢出吗?》经验,为你挑选了2个好方法。

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

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

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

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



1> Randolpho..:

除了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是正确的; 您的工具使用空字符串初始值设定值作为数组大小而不是静态数组声明.



2> dave-holm..:

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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有