C - Valgrind reporting "Syscall param points to uninitialised byte" when sigqueue call

2.7k Views Asked by At

Got a program where child processes need to send father some signals. Yet, valgrind yells at sigqueue call. Been reading for a time now but I couldn't find an answer.

Here's what child process do:

void cajero(int id){
    FILE *fp, *fp_caja;
    char filename[MAXBUFF], filename_caja[MAXBUFF], price[8];
    float p;
    union sigval val;
    bool booleano;

    ...

    val.sival_int = id;

    while(fgets(price, sizeof(price), fp)){
        p = atof(price);

        ...

        sigqueue(getppid(), SIGMONEY, val); //sigqueue Call

    }
    ...

    sigqueue(getppid(), SIGDONE, val); //sigqueue Call
    fclose(fp);
    exit(EXIT_SUCCESS);
}

And here's valgrind report for one child (it makes two calls in the inner sigqueue and one call in the outer:

==14688== HEAP SUMMARY:
==14688==     in use at exit: 0 bytes in 0 blocks
==14688==   total heap usage: 48 allocs, 48 frees, 107,460 bytes allocated
==14688== 
==14688== All heap blocks were freed -- no leaks are possible
==14688== 
==14688== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 0 from 0)
==14688== 
==14688== 1 errors in context 1 of 2:
==14688== Syscall param rt_sigqueueinfo(uinfo) points to uninitialised byte(s)
==14688==    at 0x508DBE4: sigqueue (sigqueue.c:43)
==14688==    by 0x401B3A: cajero (ejercicio9.c:316)
==14688==    by 0x40130C: main (ejercicio9.c:181)
==14688==  Address 0xffefff67c is on thread 1's stack
==14688==  in frame #0, created by sigqueue (sigqueue.c:30)
==14688==  Uninitialised value was created by a stack allocation
==14688==    at 0x4018D7: cajero (ejercicio9.c:284)
==14688== 
==14688== 
==14688== 2 errors in context 2 of 2:
==14688== Syscall param rt_sigqueueinfo(uinfo) points to uninitialised byte(s)
==14688==    at 0x508DBE4: sigqueue (sigqueue.c:43)
==14688==    by 0x401AC1: cajero (ejercicio9.c:311)
==14688==    by 0x40130C: main (ejercicio9.c:181)
==14688==  Address 0xffefff67c is on thread 1's stack
==14688==  in frame #0, created by sigqueue (sigqueue.c:30)
==14688==  Uninitialised value was created by a stack allocation
==14688==    at 0x4018D7: cajero (ejercicio9.c:284)
==14688== 
==14688== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 0 from 0)

Thanks in advance. I'm braindead right now.

EDIT: SIGMONEY and SIGDONE are SIGRTMIN and SIGRTMIN+1 respectively.

1

There are 1 best solutions below

0
On

You're not initializing the "val" union. Just change the declaration:

union sigval val = {0};