ошибка strstr valgrind - PullRequest
       14

ошибка strstr valgrind

0 голосов
/ 04 сентября 2011

Мне нужна помощь с инициализацией char* и strstr в C. Это общая проблема:

У меня есть функция func1

func1 () func2 ();

Проблема в том, что valgrind выдает ошибку, в основном говоря, что strstr может использовать неинициализированное значение.Чтобы исправить это, мне нужно сделать что-то вроде char* str = "hello world";, но тогда я не могу realloc, что является проблемой.

Я проверил свою программу со случайными строками, и проблема заключается вДело в том, что valgrind рассматривает str как неинициализированный, но я просто не знаю, как его инициализировать, не избавляясь от возможности перераспределения.Какие-либо предложения?

Ошибка:

==14356== Conditional jump or move depends on uninitialised value(s)
==14356==    at 0x4C29313: strstr (in path)
==14356==    by 0x401983: func2 (in path)
==14356==    by 0x401B06: func1 (in path)
==14356==    by 0x4013D7: main (in path)
==14356== 
==14358== Syscall param execve(argv[i]) points to uninitialised byte(s)
 at 0x4ECFCB7: execve (in path)
==14308==    by 0x4E6A76C: do_system (in path)
==14308==    by 0x4013ED: main 

Отредактировано: добавлено в актуальные функции, изменены имена и тому подобное.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Я считаю, что это ваша проблема:

В func2:

    str = realloc(str, (stringLen + pathLen+1)*sizeof(char));

    memmove(&str[rplcIndx + pathLen], &str[rplcIndx+2], stringLen-rplcIndx-2);
    memcpy(&str[rplcIndx], path, pathLen);

memmove не копирует нулевой терминатор (он находится в позиции stringLen, но последний скопированный байт будет rpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1 (помните, src[len] - это первый байт, НЕ скопированный). Это означает

  • позиция нулевого терминатора не инициализирована
  • строка, возможно, не правильно завершена

Кстати, если вы можете, asprintf - это безопасный, простой и надежный способ выполнения многих задач по манипуляции со строками, хотя он может быть немного менее эффективным.

0 голосов
/ 04 сентября 2011

В вашем func1 есть следующее:

        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        sprintf(str, "%s %s", str, currExp);

Использование одной и той же строки с обеих сторон sprintf, вероятно, плохая идея. По мере того как вывод записывается, он замыкает вход (str), что может привести к неожиданному поведению любого рода. realloc позаботится о том, какое копирование может потребоваться, поэтому ваш sprintf может быть заменен несколькими строчками:

        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        strcat(str, " ");
        strcat(str, currExp);
...