Avertissement C (gcc): initialisation à partir d’un type de pointeur incompatible lors de l’appel de pthread_cleanup_push ()

Gcc version 4.3.3 sous Ubuntu Linux 9.04 au cas où cela serait pertinent.

C’est le code incriminé:

pthread_cleanup_push(ctl_cleanup, NULL); 

avec ctl_cleanup () défini comme

 void* ctl_cleanup(void *arg); 

Il existe d’autres cas où cet avertissement apparaît dans des circonstances similaires. L’avertissement apparaît également si j’appelle quelque chose comme

 pthread_cleanup_push(pthread_mutex_unlock, (void *)&m); 

où m est de type pthread_mutex_t. L’avertissement se lit comme suit:

avertissement: initialisation à partir d’un type de pointeur incompatible

Je ne comprends pas. J’ai passé d’autres choses à l’aide de pointeurs vides (par exemple, lors du passage d’arguments à un pthread) sans cet avertissement. Est-ce que quelqu’un peut m’aider?

 void ctl_cleanup(void *arg); 

Ce qui précède est le prototype que vous recherchez. Il retourne void, pas un pointeur à void.

Le supplément * de la fonction est dû au fait qu’il prend un pointeur sur une fonction prenant un argument void * renvoyant void.