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

时间:2014-11-08 23:27:57

标签: c valgrind

我的代码有点问题:

unsigned long me_hash(MEntry *me, unsigned long size){ 
    unsigned long hashval=0; 
    int i=0;
    for(i=0; me->surname[i];i++) hashval +=me->surname[i] + 28 * hashval;; 

    for(i=0; me->surname[i];i++){
      if(me->postcode[i]) { 
        hashval += me->postcode[i] + 28 * hashval;
      }
    }
    hashval += me->house_number;
    return (hashval%size);
}

我运行Valgrind时收到的消息是

==4480== Conditional jump or move depends on uninitialised value(s)
==4480==    at 0x8048EB7: me_hash (mentry.c:66)
==4480==    by 0x8048B3E: ml_lookup (mlist.c:91)
==4480==    by 0x80488D2: main (finddupl.c:43)
==4480== 

我不知道如何解决这个问题。你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

Conditional jump or move depends on uninitialised value(s)

这是来自Valgrind的非常好的信息。

它基本上表示你拥有的if或for条件取决于未初始化的值。每次例如for循环的条件为真,执行就会在它开始时跳回。

换句话说,该消息意味着您正在访问尚未初始化的内存,如this回答中所述。

这些值为me->surname[i]me->postcode[i]。在使用之前打印它们以查看它们是否确实具有一些垃圾值(我猜他们会这样做)。


使用valgrind选项--track-origins=yes让它跟踪未初始化值的来源。这会使速度变慢并占用更多内存,但如果您需要追踪未初始化值的来源,则会非常有用。

this回答中建议。