Я пишу минималистскую оболочку на С для школы. Это работает нормально, но с помощью Valgrind я получаю эту ошибку и не могу понять, что я сделал не так. Я получаю его в начале программы:
==9396== Conditional jump or move depends on uninitialised value(s)
==9396== at 0x1093AC: get_env (msh.c:59)
==9396== by 0x1094FA: main (msh.c:106)
==9396== Uninitialised value was created by a heap allocation
==9396== at 0x483577F: malloc (vg_replace_malloc.c:309)
==9396== by 0x109341: get_env (msh.c:55)
==9396== by 0x1094FA: main (msh.c:106)
==9396==
В начале я делаю копию переменных окружения (extern char **environ
) в main()
:
if (!(env = get_env(environ)))
return (1);
Вот функция:
char **get_env(char **environ)
{
char **copy;
char **env_ptr;
char **cpy_ptr;
if (!(copy = malloc(sizeof(copy) * get_tab_size(environ) + 1)))
exit(EXIT_FAILURE);
env_ptr = environ;
cpy_ptr = copy;
while (*cpy_ptr)
{
if (!(*cpy_ptr = ft_strdup(*env_ptr)))
exit(EXIT_FAILURE);
cpy_ptr++;
env_ptr++;
}
cpy_ptr = NULL;
return (copy);
}
В конце программы я освобождаю копию этой функцией и получаю ту же ошибку:
==9396== Conditional jump or move depends on uninitialised value(s)
==9396== at 0x10BFC0: ft_free_tab2 (in /home/pom/dev/19/msh/msh)
==9396== by 0x109593: main (msh.c:126)
==9396== Uninitialised value was created by a heap allocation
==9396== at 0x483577F: malloc (vg_replace_malloc.c:309)
==9396== by 0x109341: get_env (msh.c:55)
==9396== by 0x1094FA: main (msh.c:106)
Вот функция освобождения:
void ft_free_tab2(char **env)
{
char **ptr;
if (!env)
return ;
ptr = env;
while (*ptr)
{
free(*ptr);
ptr++;
}
free(env);
}
У меня также возникает проблема, когда другие части программы используют копию. Любая помощь будет оценена.