在cppcheck中超出范围访问缓冲区

时间:2018-12-13 07:10:32

标签: c static-code-analysis cppcheck

代码可以编译,结果很好。 但是cppcheck会报告一个错误。

#define BUF_SIZE     1024
#define MAX_LENG     80

static unsigned char path[MAX_LENG];
unsigned char file_buf[BUF_SIZE*2];

memset(file_buf, 0, sizeof(file_buf));
strcpy(file_buf, "KID ");
strncat(file_buf, &path[strlen(path)-12], 10); //error this line

我尝试了几次,但仍然找不到原因。 有人可以给我一些提示吗?

感谢所有答案。

但是我还有更多问题: 如果这是致命错误,为什么编译器通过了,结果是我想要的? 在什么情况下会遇到麻烦?

还有其他实现方式吗?

如果我将其更改为

strncat(file_buf, &path[strlen(path)-12], 5);

cppcheack错误将消失。为什么?

2 个答案:

答案 0 :(得分:3)

此缓冲区:

static unsigned char path[MAX_LENG];

是静态的,因此初始化为零。首次执行此代码时,第一个字符为0。这样strlen(path)将返回(size_t)0。从中减去12,由于模运算,您将得到一个非常大的无符号数,这个数字绝对大于1024

答案 1 :(得分:2)

您访问的索引数组太大:

static unsigned char path[MAX_LENG];

static处被初始化为零。这意味着strlen(path)将返回0。

strncat(file_buf, &path[strlen(path)-12], 10);

这里您减去了12,即-12,但是当strlen返回一个无符号值时,结果索引为SIZE_MAX-12,这显然超出了范围。