Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Valgrind multiple "invalid write/read of size 1" errors

Tags:

c

valgrind

My program reads in people from a file and saves their information to a Person structure that looks like this:

struct person
{
    char *fname;
    char *lname;
    int id;
};
typedef struct person Person;

These people are held in an array of Persons and the function to fill that array looks like this (the total variable is the total number of Persons counted from the file):

Person* fillArray(int total, FILE *fin)
{
    rewind(fin);
    int i;
    char temp[50];
    char temp2[50];
    Person *p = (Person*) calloc(total, sizeof(Person));
    for(i = 0; i < total; i++)
    {
        fscanf(fin, "%s", temp);
        p[i].fname = (char *) calloc(strlen(temp)+1, sizeof(char));
        strcpy(p[i].fname, temp);
        fscanf(fin, "%s", temp2);
        p[i].lname = (char *) calloc(strlen(temp)+1, sizeof(char));
        strcpy(p[i].lname, temp2);
        fscanf(fin, "%d", &(p + i)->id);
    }
    return p;
}

I cleanup all my memory used and I calloc for the '\0' at the end of the temp strings. Not sure why I get these errors:

HEAP SUMMARY:
==4736==     in use at exit: 0 bytes in 0 blocks
==4736==   total heap usage: 8 allocs, 8 frees, 414 bytes allocated
==4736== 
==4736== All heap blocks were freed -- no leaks are possible
==4736== 
==4736== ERROR SUMMARY: 10 errors from 2 contexts (suppressed: 0 from 0)
==4736== 
==4736== 3 errors in context 1 of 2:
==4736== Invalid write of size 1
==4736==    at 0x402C6E8: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736==    by 0x804898E: fillArray (cscd240_s13_lab11Functions.c:30)
==4736==    by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736==  Address 0x41ef24f is 3 bytes after a block of size 4 alloc'd
==4736==    at 0x402A5E6: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736==    by 0x804896A: fillArray (cscd240_s13_lab11Functions.c:29)
==4736==    by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736== 
==4736== 
==4736== 7 errors in context 2 of 2:
==4736== Invalid write of size 1
==4736==    at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736==    by 0x804898E: fillArray (cscd240_s13_lab11Functions.c:30)
==4736==    by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736==  Address 0x41ef24c is 0 bytes after a block of size 4 alloc'd
==4736==    at 0x402A5E6: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736==    by 0x804896A: fillArray (cscd240_s13_lab11Functions.c:29)
==4736==    by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736== 
==4736== ERROR SUMMARY: 10 errors from 2 contexts (suppressed: 0 from 0)

Thank you for the help. I have looked through several threads and most of them are about not calloc/mallocing for the '\0' at the end of chars. I do this however I still get these errors and many more when I sort the Person array with qsort(). I apologize if this is the same problem that has been asked before, I could not find the thread.

like image 292
Austin Johnston Avatar asked Feb 16 '23 13:02

Austin Johnston


1 Answers

You're using the wrong length for the allocation of the second part,

fscanf(fin, "%s", temp2);
p[i].lname = (char *) calloc(strlen(temp)+1, sizeof(char));
strcpy(p[i].lname, temp2);

That should use strlen(temp2); there.

like image 145
Daniel Fischer Avatar answered Mar 02 '23 21:03

Daniel Fischer