Question

I'm testing my binary with valgrind, and I get many warnings like this one :

Invalid write of size 8
==7414==    at 0x402AAE: list_create_node (simple_list.c:53)
==7414==    by 0x40267E: list_add_elem_at_back (simple_list2.c:21)
==7414==    by 0x401C8A: parse (is_valid2.c:31)
==7414==    by 0x40246C: ko_parse (main.c:53)
==7414==    by 0x40255B: ko (main.c:74)
==7414==    by 0x4025E1: main (main.c:96)
==7414==  Address 0x6fe52d8 is 0 bytes after a block of size 8 alloc'd
==7414==    at 0x4C277AB: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==7414==    by 0x402A75: list_create_node (simple_list.c:50)
==7414==    by 0x40267E: list_add_elem_at_back (simple_list2.c:21)
==7414==    by 0x401C8A: parse (is_valid2.c:31)
==7414==    by 0x40246C: ko_parse (main.c:53)
==7414==    by 0x40255B: ko (main.c:74)
==7414==    by 0x4025E1: main (main.c:96)

I saw that there are many posts about that but I can't find where's the problem in my code :

t_node          *list_create_node(char *element)
{
  t_node        *node;

  if ((node = malloc(sizeof(t_node *))) == NULL)
    return (NULL);
  if ((node->value = strdup(element)))
    node->next = NULL; //// line 53 from simple_list.c
  return (node);
}

Am I doing something wrong?

Valgrind also warns about reading...And that :

==7415== Warning: invalid file descriptor 1024 in syscall close()

I have a close() smewhere in my code, but even when I comment it, the message keeps being displayed. Why is that?

Était-ce utile?

La solution

You'll want to malloc the size of what your pointer is pointing to, not the size of the pointer itself. I.e: change

(node = malloc(sizeof(t_node *)))

to

(node = malloc(sizeof(t_node)))

or better yet:

(node = malloc(sizeof *node))

Then you don't have to change the malloc-call if you decide to change the type of node.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top