我们使用的静态分析工具将类似于以下内容的 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 ,尝试将其用作索引器可能会导致不可预测的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top