代码可以编译,结果很好。 但是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错误将消失。为什么?
答案 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
,这显然超出了范围。