gpt4 book ai didi

c - 缺陷查找器 - 2 个错误溢出缓冲区(char、strlen)

转载 作者:行者123 更新时间:2023-11-30 19:00:36 24 4
gpt4 key购买 nike

我正在尝试找出如何解决程序中的 2 个命中问题,但我不明白如何...

我有这段代码:

#include <stdio.h>
#include <string.h>
#define MAXSIZE 40
void test(char *str) {
char buf[MAXSIZE];
if(strlen(str) > MAXSIZE)
return;
strlcpy(buf, str);
printf("result: %s\n", buf);
}

int main(int argc, char **argv) {
char *userstr;

if(argc > 1) {
userstr = argv[1];
test(userstr);
}
int i[10];
int j = 0;

while (j < 10000)
{
i[j] = 5;
++j;
}

for (j = 0; j < sizeof i / sizeof i[0]; ++j)
printf("Value = %d\n", i[j]);
return 0;
}

我得到了这 2 个点击:

C:\Users\vord\codetest\test1.txt:5:  [2] (buffer) char:
Statically-sized arrays can be improperly restricted, leading to potential
overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use
functions that limit length, or ensure that the size is larger than the
maximum possible length.
C:\Users\vord\codetest\test1.txt:6: [1] (buffer) strlen:
Does not handle strings that are not \0-terminated; if given one it may
perform an over-read (it could cause a crash if unprotected) (CWE-126).

第一次点击我试图理解它,因为 MAXSIZE 已经设置为 40 ,它已经受到限制......第二次点击我寻找解决方案,但我发现一些不起作用的东西......

如果您能帮助我弄清楚如何修复这些点击,我将非常高兴。

最佳答案

strlen() 函数返回字符串的长度,不包括结尾的“\0”,因此您需要声明大小等于MAXSIZE + 1 的缓冲区。另外,为了确保 buf 将以零终止(printf() 调用所需),只需用 0 初始化 buf 即可。在这种情况下,这是最便宜的解决方案。

试试这个:

void test(char *str) {
char buf[MAXSIZE + 1] = { 0 };
if (strlen(str) > MAXSIZE)
return;
strlcpy(buf, str, MAXSIZE);
printf("result: %s\n", buf);
}

关于c - 缺陷查找器 - 2 个错误溢出缓冲区(char、strlen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com