如何修复Valgrind“条件跳转...”错误

时间:2019-08-15 16:57:03

标签: c debugging valgrind

所以我知道还有其他人和我有同样的问题,但是不幸的是我没有得到解决...所以基本上我正在寻找哈希表中的键(基于给定的单词)(如果找不到) NULL,但如果找到,则返回值。它会自我重复,直到读取的FILE中没有更多的单词为止。

这是valgrind的输出。

    ==877683== Conditional jump or move depends on uninitialised 
    value(s)
    ==877683==    at 0x4C31258: __strlen_sse2 (in 
    /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==877683==    by 0x401641: _strdup (loesung.c:58)
    ==877683==    by 0x401641: ht_get (loesung.c:212)
    ==877683==    by 0x400E5C: main (loesung.c:513)
    ==877683==  Uninitialised value was created by a stack 
    allocation
    ==877683==    at 0x400B0A: main (loesung.c:325)

这是一些代码...

    while((c = fgetc(input)) != EOF) {
        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){   
                ...
        }
        else if(c == 10 || (c >= 32 && c <= 64) || (c >= 91 && c <= 
    96) || (c >= 123 && c <= 126)){
            if(ht_get(dict,word) == NULL){....}         //LINE 513


   int main(int argc, char *argv[]){  //LINE 325 Where the value 
                                        was created apparently... I 
                                        dont get this at all!
   if(argc != 2){
     fprintf(stderr,"...");
     exit(2);
     return 2;
   }
   else {
     wb = fopen(argv[1], "r");
   }

这是函数ht_get ...

    char *ht_get(HashTable *hashtable, const char *key){
    char *key_cp = NULL;
    unsigned int i = 0;
    List *tmp;

    key_cp = _strdup(key);              //LINE 212
    i = hash(key, hashtable->size);
    tmp = hashtable->array[i];

    while (tmp != NULL) {
            if (str_cmp1(tmp->key, key_cp) == 0) { 
                    break;
            }
            tmp = tmp->next;
    }
    free(key_cp);

    if (tmp == NULL) {
            return NULL;
    }
    return tmp->value;
    }

并且_strdup函数与strdup相同,但是我必须自己编写它,因为string.h库中的那个不起作用。

所以我想做的就是初始化变量liek this:

char * getWord;
getWord = strdup(ht_get(dict,word));

以及:

char * getWord = ht_get(dict,word);

和其他一些不起作用的方式。 很抱歉,这个问题很久。

1 个答案:

答案 0 :(得分:0)

仔细检查以下三行内容:

==877683==    by 0x401641: _strdup (loesung.c:58)
==877683==    by 0x401641: ht_get (loesung.c:212)
==877683==    by 0x400E5C: main (loesung.c:513)

从您的代码段中:

...
    key_cp = _strdup(key);              //LINE 212
...
            if(ht_get(dict,word) == NULL){....}         //LINE 513
...
  

由于keyht_get的第二个参数并传递给_strdup,因此得出的结论是word尚未初始化。

尽管您没有显示所有代码,但有可能正在构建word,直到遇到单词分隔符,然后调用ht_get

  

如果遇到的第一个字符是单词分隔符,则您的逻辑缺陷是word不会被初始化。

一种可能的解决方法是建立一个标志来指示您是否创建了单词。该标志被初始化false,并且在形成单词时变为true,并且在处理单词分隔符时变为false

bool have_word = false;
...
while ((c = fgetc(input)) != EOF) {
    if (isalpha(c)) {
        ... make a word
        have_word = true;
    } else {
        if (have_word) {
            ... process a word
        }
        have_word = false;
    }
...