我如何使用valgrind在C中修复此错误:大小为8的写入无效[已关闭]

3phpmpom  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(116)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
这篇文章是编辑和提交审查2天前。
Improve this question
编译完我的代码后,我遇到了一些关于内存的问题,在我的linux终端上运行./valgrind后,我遇到了这个函数的以下错误:
从文件读取行时大小为8的写入无效。
下面是我的函数read_lines_from_file

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int lines_count = 0;
char** read_lines_from_file(FILE* file) {
    fseek(file, 0, SEEK_SET);
    char** lines = NULL;// ça renvoie NULL si le fichier est vide
    char  line[100];
    while (fgets(line, 100, file)) {// nous faisons l'hypothèse qu'une ligne ne dépasse pas 100 caractères
        line[strlen(line)-1]='\0';// on enlève le \n
        lines = realloc(lines, (lines_count + 1) * sizeof(char*));
        lines[lines_count] = malloc(strlen(line) + 1);
        strcpy(lines[lines_count], line);
        lines_count++;
    }
    return lines;
}

我不明白它从何而来,我如何纠正,以消除这个错误。

bvhaajcl

bvhaajcl1#

代码至少存在以下问题:
不清楚是否解决了“拆分时大小为1的无效写入”。

调用方缺少有关已读取多少行的信息

read_lines_from_file在第二次呼叫时没有被重置为0,因此向呼叫者传达了错误的线路数量。

黑客利用

line[strlen(line)-1]='\0';是UB,其中读取的第一个字符是 * 空字符 *。
此外,输入不一定包括'\n'

// Better as
line[strcspn(line, "\n")] = '\0';

缺少错误检查

代码不检查分配错误。

100多个字符的行处理不当

相关问题