Error message from Helgrind: 

$ valgrind --tool=helgrind  ./prog 
...
==6587== Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without 
prior sem_post
==6587==    at 0x4850069: sem_wait_WRK (hg_intercepts.c:3155)
==6587==    by 0x4851180: sem_wait@* (hg_intercepts.c:3174)
==6587==    by 0x109271: main (in /media/sf_antiX/erros/duvida/prog)
…

Error message from Drd: 

$ valgrind --tool=drd --trace-semaphore=yes  ./prog
...
==6828== [1] sem_wait      0x487f000 value 0 -> 4294967295
==6828== Invalid semaphore: semaphore 0x487f000
==6828==    at 0x4866C1A: sem_wait_intercept (drd_pthread_intercepts.c:1570)
==6828==    by 0x4866C1A: sem_wait@* (drd_pthread_intercepts.c:1578)
==6828==    by 0x109271: main (in /media/sf_antiX/erros/duvida/prog)
==6828== semaphore 0x487f000 was first observed at:
==6828==    at 0x4865A16: sem_open_intercept (drd_pthread_intercepts.c:1527)
==6828==    by 0x4865A16: sem_open@* (drd_pthread_intercepts.c:1538)
==6828==    by 0x1091D3: main (in /media/sf_antiX/erros/duvida/prog)
…  

So the issue seems to be that according to Drd a semaphore that has the value 
of zero, with a sem_wait() gets decremented to 4294967295. (????????) 
I have the sample code on the end of this message, and I have tried to run the 
code on several recent versions of Valgrind (32.3 and others), and on x86-64 
using antiX Linux, MX Linux, Ubuntu Linux and FreeBSD. I have also tried ARM 64 
bits under Ubuntu, and the behaviour is the same. The sample program seems to 
work ok. 

My thanks to all the Valgrind developers for the wonderful software they 
created, and I sincerely hope the issue is on my side (between chair and 
keyboard).

Paulo Ferreira 
======================
#include <stdio.h>
#include <fcntl.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/wait.h>

#define NUM 10 

int main(void)
{
    int i;
    sem_t *sem1; // First semaphore
    sem_t *sem2; // Second semaphore

    // create, initialize semaphores
    sem1 = sem_open("/semaphore1", O_CREAT,  0600, 0);
    sem2 = sem_open("/semaphore2", O_CREAT,  0600, 1);
        pid_t pid = fork(); 
    if (pid>0) // Parent process
    {
        for (i = 0; i < NUM;  i++)
        {
            sem_wait(sem2); // Lock the semaphore
            write(1, "a\n", 2);
            sem_post(sem1); // Release the semaphore lock
        }
        wait(NULL);
    }
    else // Child process
    {
        for (i = 0; i < NUM; i++)
        {   
                    sem_wait(sem1); // Lock the semaphore
            write(1, "b\n", 2);
            sem_post(sem2); // Release the semaphore lock
        }
    }


        // Close the Semaphores
    sem_close(sem1);
    sem_unlink("/semaphore1");
    sem_close(sem2);
    sem_unlink("/semaphore2");
    return 0;
}
==========================

 

    



_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to