[C] -pedantic et affectation entre pointeur de fonction et "void *"

-pedantic et affectation entre pointeur de fonction et "void *" [C] - C - Programmation

Marsh Posté le 31-03-2005 à 12:47:25    

Salut :)
 
j'ai un ptit problème avec le "-pedantic" :o
j'essaye de n'avoir aucun warning à la compilation (histoire de faire propre ;)) mais la y'en a un qui me résiste :/
 
le code déjà :
il s'agit d'édition de liens dynamique, tout ce qu'il y a de plus banal en somme [:spamafote]
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4. int main(int argc, char **argv)
  5. {
  6.   //le pointeur vers la librairie(ou le module) chargee
  7.   void *handle = NULL;
  8.   //le pointeur vers la fonction coucou dans le module
  9.   //la déclaration doit être cohérente avec celle chargée dans le module
  10.   char *(*coucou)(void);
  11.   char *erreur = NULL;
  12.   if(argc == 1){
  13.     fprintf(stdout,"    Usage : %s [libcoucou1.so|libcoucou2.so]\n",argv[0]);
  14.     exit(0);
  15.   }
  16.   //on tente d'ouvrir la librairie demandee
  17.   handle = dlopen(argv[1], RTLD_LAZY);
  18.   //en cas d'echec...
  19.   if(handle == NULL){
  20.     fprintf(stderr,"%s\n",dlerror());
  21.     exit(1);
  22.   }
  23.   //on tente de resoudre le symbole coucou
  24.   //en d'autres termes on recherche la fonction coucou dans la lib ouverte
  25.   coucou = dlsym(handle,"coucou" );
  26.  
  27.   //en cas d'erreur...
  28.   if((erreur = dlerror()) != NULL){
  29.     fprintf(stderr,"%s\n",erreur);
  30.     exit(1);
  31.   }
  32.   //on appelle la fonction coucou offerte par la lib
  33.   printf("%s\n",(*coucou)());
  34.   //on referme la lib
  35.   dlclose(handle);
  36.   return 0;
  37. }


 
 
la compilation et son warning :

gcc -Wall -pedantic -std=c99 test.c -o test -ldl
test.c: In function `main':
test.c:30: attention : ISO C interdit affectation entre pointeur de fonction et « void * »


 
 
c'est donc le "coucou = dlsym(handle,"coucou" );" qui pose problème, et j'arrive pas à trouvé le castage ou l'astuce pour faire disparaître proprement ce warning :/
 
 
vous auriez une idée ?


Message édité par Deadog le 31-03-2005 à 12:48:24
Reply

Marsh Posté le 31-03-2005 à 12:47:25   

Reply

Marsh Posté le 31-03-2005 à 12:53:45    

T'as le cul entre 2 chaises. Et encore, ça serait pire en C++ (le cul entre 3 chaises ?).
 
Regarde la partie "Rationale" là:
  http://www.opengroup.org/onlinepub [...] dlsym.html

Reply

Marsh Posté le 31-03-2005 à 13:06:23    

merde :/
 
c'est d'autant plus génant que dans mon vrai code j'en ai un bon paquets des comme ça :/²
 
 
bah, euh, merci quand même ;)

Reply

Marsh Posté le 31-03-2005 à 13:35:04    

Deadog a écrit :

j'ai un ptit problème avec le "-pedantic" :o
j'essaye de n'avoir aucun warning à la compilation (histoire de faire propre ;)) mais la y'en a un qui me résiste :/

Code :
  1. void *dlsym(void *handle, char *symbol);
  2.   char *(*coucou)(void);
  3. <...>
  4.   coucou = dlsym(handle,"coucou" );


 
 
la compilation et son warning :

gcc -Wall -pedantic -std=c99 test.c -o test -ldl
test.c: In function `main':
test.c:30: attention : ISO C interdit affectation entre pointeur de fonction et « void * »


c'est donc le "coucou = dlsym(handle,"coucou" );" qui pose problème, et j'arrive pas à trouvé le castage ou l'astuce pour faire disparaître proprement ce warning :/


Le but de la bonne programmation n'est pas de 'faire disparaitre les warnings', mais plutôt de comprendre leur sens et d'agir en conséquence.  
 
Quel est le type retourné par dlsym () ? Après recherche, (fonction non standard), il semble que cette fonction retourne void *, ce qui n'est évidemment pas le bon type pour l'adresse d'une fonction. C'est pour ça que le compîlateur rale.  
 
En l'occurence, void * définit un type de pointeur générique sur un objet, mais qui n'est pas compatible (de façon portable) avec un pointeur de fonction.
 
http://mapage.noos.fr/emdel/notes.htm#pointeurs
 
Tu peux masquer le défaut de conception de dlsym() avec un horrible cast du type de la fonction, mais ça ne résout rien. Il n'y a malheureusement pas d'alternative, car le défaut vient de dlsym() et pas de ton code.
 
Je peux déjà affirmer que dlsym() ne peut fonctionner tel quel, que sur des architectures dont la taille des pointeurs sur objet et sur fonctions sont identiques (ce n'est pas le cas du X86 en mode réel avec modèle de mémoire medium ou compact) et où les registres pointeurs données et fonctions sont banalisés.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 31-03-2005 à 14:36:49    

et bien, même en faisant :

Code :
  1. typedef char* (*coucou_t)(void);
  2. ...
  3. coucou_t coucou=NULL;
  4. ...
  5. coucou = (coucou_t) dlsym(handle,"coucou" );


 
y'a tjrs un warning (différent mais similaire)
 
 
pour la portabilité, hum, bah j'ai pas de solution alternative [:spamafote]


Message édité par Deadog le 31-03-2005 à 14:44:54
Reply

Marsh Posté le 31-03-2005 à 14:51:08    

Deadog a écrit :

et bien, même en faisant :

Code :
  1. typedef char* (*coucou_t)(void);
  2. ...
  3. coucou_t coucou=NULL;
  4. ...
  5. coucou = (coucou_t) dlsym(handle,"coucou" );


 
y'a tjrs un warning (différent mais similaire)


C'est normal et c'est plutôt c'est plutôt sain. Il n'y a pas de solution portable. Le Rationale est assez clair sur le sujet (fonction mal conçue...)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed