条件跳转或移动取决于未初始化的值

辣椒纤维

所以,valgrind 给了我那个错误,我用 --track-origins=yes 运行它并找到了错误所在的行,但我不明白错误是什么或如何修复它。

#include <stdio.h>
#include <stdlib.h>

typedef struct Date{
    int year;
    int month;
    int day;
} Date;

typedef struct Data{
    Date date;
    float temp;
    float uncertainty;
    char country[100];
} Data;

int main(){
    FILE* f = fopen("tempcountries_short.csv", "r");
    char* line = NULL;
    int capacity = 0;
    int countries_capacity = 0;
    int line_ix = 0;
    char c;
    Data* country = NULL;
    while ((c = fgetc(f)) != '\n'){ 
        if (line_ix + 1 > capacity){
            if (capacity == 0)                    
                capacity = 10;
            else
                capacity = capacity * 2;
            line = realloc(line, capacity); 
        }
        line[line_ix] = c;
        line_ix++;
    }
    if (countries_capacity == 0)
        countries_capacity = 10;
    else
        countries_capacity = countries_capacity * 2;
    country = realloc(country, countries_capacity);
    printf("%i\n",sscanf(line, "%i - %i - %i, %f , %f , %s", 
           &country->date.year, &country->date.month,
           &country->date.day, &country->temp, &country->uncertainty,
           country->country));
}

这是 Valgrind 的输出,有选项 --leak-check=full 和 --track-origins=yes:https://pastebin.com/EyqDGBmQ正如你所看到的,还有很多其他错误,我不明白是什么导致了它们。

该程序正在从包含有关许多国家/地区温度的数据的文件中读取行,我只是采用了单个国家/地区的代码部分来复制错误,但 country 应该是许多数据结构的数组。这是我正在阅读的文件中的示例行:

1972-03-01,4.787,0.342,斯洛伐克

膨胀了
country = realloc(country, countries_capacity);

你似乎依赖于realloc(0, new_size)表现得像malloc(new_size)这很好,但是您必须确保传递给的指针变量realloc确实为空。在此之前没有代码初始化country变量,并且在它的声明中......

Data* country;

...没有初始化程序。将此更改为

Data *country = 0;

那部分问题应该消失。

通常,当您从 中得到一整串错误时valgrind,只有第一个是有意义的,所以看看这是否能解决您的所有问题。


编辑:使用上述更正的程序版本,输入显示的输入示例行,我没有收到关于内部未初始化值的任何投诉realloc,但我仍然收到关于内部未初始化值的投诉sscanf

==28542== Conditional jump or move depends on uninitialised value(s)
==28542==    at 0x4C340E6: rawmemchr (vg_replace_strmem.c:1409)
==28542==    by 0x4EB6291: _IO_str_init_static_internal (strops.c:41)
==28542==    by 0x4EA476C: __isoc99_vsscanf (isoc99_vsscanf.c:41)
==28542==    by 0x4EA46D3: __isoc99_sscanf (isoc99_sscanf.c:31)
==28542==    by 0x108886: main (in /tmp/a.out)

和关于无效写入的投诉:

==28542== Invalid write of size 4
==28542==    at 0x4E98FFB: _IO_vfscanf (vfscanf.c:1898)
==28542==    by 0x4EA4781: __isoc99_vsscanf (isoc99_vsscanf.c:43)
==28542==    by 0x4EA46D3: __isoc99_sscanf (isoc99_sscanf.c:31)
==28542==    by 0x108886: main (in /tmp/a.out)
==28542==  Address 0x51f41a8 is 8 bytes inside a block of size 10 alloc'd
==28542==    at 0x4C2CABF: malloc (vg_replace_malloc.c:298)
==28542==    by 0x4C2EE04: realloc (vg_replace_malloc.c:785)
==28542==    by 0x10883C: main (in /tmp/a.out)

这些都是由真正的错误引起的:第一个是因为line数组从未被制作成正确的 C 字符串(通过添加 nul 终止符),第二个是因为传递给大小realloc是错误的。你需要

line[line_ix] = '\0';

紧接在while循环之后,以及

country = realloc(country, countries_capacity * sizeof(Data));

而不是realloc你现在电话。


通过这些更改,我不会收到 valgrind 的投诉。你仍然有你正在使用的问题sscanf,这总是一个坏主意,但 valgrind 无法帮助你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Valgrind 消息:条件跳转或移动取决于未解析的未初始化值

fread() 导致 Valgrind 错误:“条件跳转或移动取决于未初始化的值”

查明“条件跳转或移动取决于未初始化的值” valgrind消息

条件跳转或移动取决于使用valgrind的未初始化值

条件跳转或移动取决于未初始化的值strcat

错误:条件跳转或移动取决于未初始化的值-C valgrind

Valgrind + C:条件跳转或移动取决于未初始化的值

条件跳转或移动取决于std :: wistringstream的未初始化值

释放字符时,“有条件的跳转或移动取决于未初始化的值”

C ++中的动态数组-条件跳转或移动取决于未初始化的值

Valgrind:条件跳转或移动取决于未初始化的值-打开文件

条件跳转或移动取决于 for 循环中带有 strcat 的未初始化值

Valgrind:使用哈希函数时,条件跳转或移动取决于未初始化的值

如何修复C中的“条件跳转或移动取决于未初始化的值”错误

条件跳转或移动取决于 strcpy 处的未初始化值

CPP中的Valgrind和内存泄漏:“有条件的跳转或移动取决于未初始化的值”

二进制搜索树,Valgrind条件跳转或移动取决于未初始化的值

Valgrind:libnvidia-glcore.so.346.47条件跳转或移动取决于未初始化的值

Valgrind:使用atomic :: compare_exchange_weak时,条件跳转或移动取决于未初始化的值

有条件的跳转或移动取决于未初始化的值和无效的大小写

如何解决“有条件的跳跃或移动取决于未初始化的值” valgrind错误而导致的strlen错误?

Valgrind:条件跳转,未初始化的值,C ++基本代码

C - 链表 valgrind 未初始化错误取决于添加元素的顺序

swiftui @State值取决于@ObservedObject ViewModel初始化错误

反应useEffect取决于在调用api之后初始化的值

在类型取决于布尔值的全局范围内初始化结构

骆驼弹簧动态初始化取决于消息

分割错误SIGSEGV取决于初始化方法

未初始化条件Valgrind