2013-11-20 3 views
2

Я получаю эту ошибку из Valgrind, когда я пытаюсь запустить мою программу:C - условный переход или шаг зависит от неинициализированного значения (ов)

==23152== Conditional jump or move depends on uninitialised value(s) 
==23152== at 0x4C2D8D0: strcmp (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23152== by 0x40096C: str_lower_cmp (functions.c:41) 
==23152== by 0x400BB8: list_sort (list_sort.c:34) 
==23152== by 0x400CC7: get_wdir_content (working_dir.c:27) 
==23152== by 0x400C27: main (main.c:18) 
==23152== Uninitialised value was created by a heap allocation 
==23152== at 0x4C2C27B: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23152== by 0x400D4C: xmalloc (xfunctions.c:35) 
==23152== by 0x400886: lower_string (functions.c:20) 
==23152== by 0x400945: str_lower_cmp (functions.c:39) 
==23152== by 0x400BB8: list_sort (list_sort.c:34) 
==23152== by 0x400CC7: get_wdir_content (working_dir.c:27) 
==23152== by 0x400C27: main (main.c:18) 
==23152== 
==23152== Conditional jump or move depends on uninitialised value(s) 
==23152== at 0x400BBB: list_sort (list_sort.c:34) 
==23152== by 0x400CC7: get_wdir_content (working_dir.c:27) 
==23152== by 0x400C27: main (main.c:18) 
==23152== Uninitialised value was created by a heap allocation 
==23152== at 0x4C2C27B: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23152== by 0x400D4C: xmalloc (xfunctions.c:35) 
==23152== by 0x400886: lower_string (functions.c:20) 
==23152== by 0x400945: str_lower_cmp (functions.c:39) 
==23152== by 0x400BB8: list_sort (list_sort.c:34) 
==23152== by 0x400CC7: get_wdir_content (working_dir.c:27) 
==23152== by 0x400C27: main (main.c:18) 
==23152== 

Хотя я не могу сказать, что это неправильно, я угадываю это происходит от list_sort.c:

t_llist *list_sort(t_llist *list) 
{ 
    struct s_node *tmp; 

    tmp = list->head; 
    while (tmp != NULL) 
    { 
     if (tmp->next != NULL) 
     { 
      if (!tmp->name || !tmp->next->name) 
       printf("Reached.\n"); 
      if (str_lower_cmp(tmp->name, tmp->next->name) > 0) 
      { 
       data_swap(tmp, tmp->next); 
       tmp = list->head; 
      } 
      else 
       tmp = tmp->next; 
     } 
     else 
      return (list); 
    } 
    return (list); 
} 

Означает ли это, что в какой-то момент,> имя tmp- или tmp-> next-> значение имя неиницализированные?

EDIT (код functions.c)

char   *lower_string(char *s) 
{ 
    char   *res; 
    int   i; 

    i = 0; 
    res = xmalloc(sizeof(*res) * strlen(s) + 1); 
    while (s[i]) 
    { 
     if (s[i] >= 'A' && s[i] <= 'Z') 
     res[i] = s[i] + 32; 
     else 
     res[i] = s[i]; 
     i++; 
    } 
    s[i] = '\0'; 
    return (res); 
} 

int    str_lower_cmp(char *s1, char *s2) 
{ 
    char   *tmp1; 
    char   *tmp2; 
    int   res; 

    tmp1 = lower_string(s1); 
    tmp2 = lower_string(s2); 
    res = strcmp(tmp1, tmp2); 
    free(tmp1); 
    free(tmp2); 
    return (res); 
} 
+0

Хммм, что произойдет, если вы проверите указатель списка перед его использованием? – LostBoy

+0

Извините, какой указатель? t_llist * list? – Kernael

+0

Поскольку отчет находится в 'strcmp', вы можете определить, что вы выделяете память для своих узлов, которая является обработкой шаблонов с помощью утилиты отладки valgrind, тогда значения указателя-указателя проверяются для этого шаблона их debug strcmp. Другими словами, * да *, вы, вероятно, отправляете неопределенный параметр 'name' либо по значению, либо никогда должным образом не заполняете и не завершаете фактические данные, на которые он указывает. Не зная, как вы на самом деле строите свой список, невозможно сказать, как вы делаете эту ошибку. – WhozCraig

ответ

3

Первоначально valgrind говорит вам, что вы работаете strcmp с адресом памяти, выделяемой malloc, исходя из функции lower_string, но не имеет начальное значение, присвоенное ,

Это будет означать неопределенное поведение, а это значит, что в зависимости от вашего кода может быть очень опасно, поскольку это может привести к неожиданным результатам.

Я бы предложил использовать calloc в lower_string.

Редактировать: your're устанавливает s[i] в 0 вместо res[i] (указатель, который вы выделили и возвращаете). С другой стороны, я бы предложил использовать calloc и проверки res!=NULL

+0

@WhozCraig Согласен. Обновленный ответ;). Но, просто для того, чтобы уточнить, я имел в виду, что с 'strcmp', скорее всего, он немедленно вернется, и вы войдете в блок' else' (я предполагаю, что есть 'if/else' проверка' strcmp' response) – jcm

+0

I ' m вызывает malloc внутри моей функции xmalloc, где я проверяю его возврат. – Kernael

+0

@Kernael Затем просто вызовите 'calloc' вместо' malloc', и вы получите всю выделенную память, инициализированную 0 – jcm

1

Ваша ошибка здесь, в lower_string Вы не завершения строки вы выделяющий:

char *lower_string(char *s) 
{ 
    char *res; 
    int i; 

    i = 0; 
    res = xmalloc(sizeof(*res) * strlen(s) + 1); 
    while (s[i]) 
    { 
     if (s[i] >= 'A' && s[i] <= 'Z') 
      res[i] = s[i] + 32; 
     else 
      res[i] = s[i]; 
     i++; 
    } 
    s[i] = '\0'; // THIS IS WRONG 
    return (res); 
} 

Выделенная линия должна быть таким:

res[i] = '\0'; // THIS IS RIGHT 

И заметьте, это будет пойман, если вы правильно прошли входную строку в качестве параметра const:

char *lower_string(const char *s) // MAKE PARAM CONST 

Выполнение этого не удалось бы скомпилировать, потому что ваше назначение s[i] = '\0' нарушило бы условие const. Общее правило, если вам необходимость к модификации что-то передается в качестве побочного адреса параметра, убедитесь, что const

+0

Спасибо, это была такая глупая ошибка в конце. Спасибо за подсказку, я буду использовать ее. – Kernael

+0

@ Kernael, если вы считаете, что это «немой», вам будет очень неприятно знать, что вы можете реализовать 'str_lower_cmp' без динамического выделения вообще, тем самым делая проблему не-проблемой для начала. Считают, что. – WhozCraig

0

, когда «символ * s» передается lower_string пустая строка, которую вы хотите иметь программу разбивающихся тоже. Вызов calloc как jcm сказал бы помочь исправить эту проблему

Смежные вопросы

 Смежные вопросы