IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Incompatibilité des normes


Sujet :

C

  1. #1
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut Incompatibilité des normes
    Bonjour, je me permet de poser une question sur une chose qui me chagrine.

    Je suis tombé sur un article qui proposait la création de plugin en utilisant les fonctions de libdl.

    Bon, je vais pas vous faire un long speach sur l'utilisation de ces fonctions mais pour l'utilisation de dlsym, il y a un problème ...

    dlsym me renvoie un pointeur void * et il faut effectuer un cast par un pointeur de fonction pour récupérer la fonction de la bibliothèque que l'on vient de charger pour pouvoir utiliser cette fonction.

    Cependant, un cast d'un pointeur void* en un pointeur de fonction n'est semble t'il pas autorisé par la norme (en tout cas c'est ce que me dis gcc).

    Alors il y a une chose qui m'embête : dlsym semble être POSIX donc normalisé mais ne semble donc pas être compatible avec les normes du C. Il n'y aurait pas contradiction ?


    Je prend l'exemple de dlsym mais il doit y en avoir d'autres.

    Si quelqu'un a une explication ou même une solution pour contourner le problème ça m'interresse ...

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Bonjour,

    J'ai utilisé dlsym dans un programme, et ne me souviens pas avoir eu de problèmes particuliers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        func_name = (int (*) (char * usrName , char * grpName, int usrId, int grpId, int mode) )
            dlsym(profile_handle, "getMyProfile");
    Peux-tu poster le code qui te pose problème ?

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Moi j'ai préféré utiliser les fonctions de la GLib pour ca ... en plus c'est portable "sans" problèmes

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Alors voilà le test que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
     
    int main (void)
    {
      void *handl;
      int (*func) (void *);
     
      func = (int (*) (void *)) dlsym(handl, "exemple");
     
      return EXIT_SUCCESS;
    }
    Lorsque je compile j'obtiens :

    test.c: In function 'main':
    test.c:10: warning: ISO C forbids conversion of object pointer to function pointer type
    test.c:10: warning: 'handl' is used uninitialized in this function
    Bon le deuxième warning est normal, je n'ai pas appelé dlopen, mais l'exemple est là pour se concentrer sur le problème.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Incompatibilité des normes
    Citation Envoyé par PRomu@ld
    dlsym me renvoie un pointeur void * et il faut effectuer un cast par un pointeur de fonction pour récupérer la fonction de la bibliothèque que l'on vient de charger pour pouvoir utiliser cette fonction.
    Vu de la norme, le comportement est indéterminé. Dans la pratique, si la doc te dis de faire comme ça, c'est que sur la plateforme concernée, le comportement est défini.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    test.c: In function 'main':
    test.c:10: warning: ISO C forbids conversion of object pointer to function pointer type
    C'est sûr que ce n'est pas une pratique standard. Pour l'utiliser il faut être moins restrictif.

    Il y a des cas où on ne peut pas écrire du code strictement conforme. Ces cas doivent être documentés et le comportement expliqué.

  7. #7
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Dans la pratique, si la doc te dis de faire comme ça, c'est que sur la plateforme concernée, le comportement est défini.
    Je suis bien d'accord mais ça ne te dérange pas toi ? En tout cas, moi si ! Les warnings me dérangent surout pour me dire que ce que je fais n'est pas sensé être autorisé par la norme ... Si encore la bibliothèque avait été crée par un petit amateur peu scrupuleux des normes ça ne m'aurait pas dérangé mais là la fonction est POSIX tout de même ...

    Moi j'ai préféré utiliser les fonctions de la GLib pour ca ... en plus c'est portable "sans" problèmes
    Je vais aller voir ça.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Dans la pratique, si la doc te dis de faire comme ça, c'est que sur la plateforme concernée, le comportement est défini.
    Je suis bien d'accord mais ça ne te dérange pas toi ? En tout cas, moi si ! Les warnings me dérangent surout pour me dire que ce que je fais n'est pas sensé être autorisé par la norme ...
    La norme dit que le comportement dépend de l'implémentation. Donc, ça peux fonctionner. Le problème des pointeurs de fonctions est qu'il n'y a pas de pointeur de fonction générique. Cette solution un peu batarde a été trouvée, mais elle n'est pas portable, c'est tout. Dans les cas où les conditions sont réunies (par exemple, un pointeur sur objet a la même taille qu'un pointeur sur fonction), le fonctionnement est garanti.

    Il vaut mieux des warnings explicables que pas de warnings parce qu'on a baissé le niveau de diagnostic.

  9. #9
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai juste lu l'entête de la documentation des fonctions de la glib :

    The current implementation supports all systems that provide an implementation of dlopen()
    Ca commence bien ...

    Il vaut mieux des warnings explicables que pas de warnings parce qu'on a baissé le niveau de diagnostic.
    Oui, d'accord, de toute façon il faudra bien que je m'en contente ...

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Essaie de passer par un size_t sinon.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par loufoque
    Essaie de passer par un size_t sinon.
    Un size_t pour faire quoi ?

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: Incompatibilité des normes
    Citation Envoyé par PRomu@ld
    Alors il y a une chose qui m'embête : dlsym semble être POSIX donc normalisé mais ne semble donc pas être compatible avec les normes du C. Il n'y aurait pas contradiction ?
    Je ne vois pas de contradiction. La norme C specifie un certain nombre de choses et en laisse d'autres volontairement indeterminees. Posix complete la norme C en specifiant une partie de ces choses indeterminees, mais a ma connaissance ne demande rien que la norme C ne permet pas. Donc Posix est compatible avec le C.

  13. #13
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    warning: ISO C forbids conversion of object pointer to function pointer type
    Je ne suis pas un expert en anglais mais il me semble que forbid ça veut dire interdire, non ?

    Nous ne sommes plus dans l'indéterminé, ou alors c'est gcc qui s'avance là dessus...

    Une fonction POSIX ferait donc une chose que le C interdit, ça n'est donc pas complèter la norme c'est passer outre, en tout cas c'est comme ça que je le vois.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Nous ne sommes plus dans l'indéterminé, ou alors c'est gcc qui s'avance là dessus...
    Je pense que gcc a grossi le trait... Ca mérite un rapport de bug...

  15. #15
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En regardant sommairement dans la base bugzilla de gcc, je n'ai rien trouvé faisant mention de ceci, peut-être un rapport à faire donc.

    Par contre sur google je suis tombé là dessus :

    http://www.trilithium.com/johan/2004/12/problem-with-dlsym/

    La fin me parait interressante :

    The Open Group page on dlsym indicates that a future version may either add a new function to return function pointers, or the current interface may be deprecated in favor of two new functions: one that returns data pointers and the other that returns function pointers.
    Et effectivement le problème est expliqué :

    http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html

    Et visiblement c'est gcc qui exagère, comme tu le disais :
    The result of converting a pointer to a function into a pointer to another data type (except void *) is still undefined,

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Par contre sur google je suis tombé là dessus :

    http://www.trilithium.com/johan/2004/12/problem-with-dlsym/
    C'est clair que la solution est là, mais il faudrait unifier les types retour, ou supporter un cast...

  17. #17
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    par exemple, un pointeur sur objet a la même taille qu'un pointeur sur fonction
    je comprend bien la chose. Il ne faudrait pas forcément avoir la même taille, si le pointeur de fonction a une taille inférieure, ça le fait aussi (mais est-ce possible ?)

    http://www.trilithium.com/johan/2004/12/problem-with-dlsym/
    Là dedans, dans les solutions "probables" en attendant une éventuelle sépartation en deux de dlsym, il parle de "union cast", j'avoue ne pas trop voir le rapport, ou alors je ne vois pas du tout à quoi il est fait référence, as-tu des infos là dessus ?

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Là dedans, dans les solutions "probables" en attendant une éventuelle sépartation en deux de dlsym, il parle de "union cast", j'avoue ne pas trop voir le rapport, ou alors je ne vois pas du tout à quoi il est fait référence, as-tu des infos là dessus ?
    une horreur comme ça, je suppose...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    union fun_ptr
    {
       void *p;
       int (*fp_int)();
       void (*fp_void)();
       /* etc. */
    };

  19. #19
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    warning: ISO C forbids casts to union type

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par loufoque
    Essaie de passer par un size_t sinon.
    Un size_t pour faire quoi ?
    C'est l'une des solutions citées.
    You could resort to a variety of tricks to avoid the direct object/function pointer cast:

    * casting via an integral type

    * "union cast" (set one member of a union, get another)

    * memcpy

Discussions similaires

  1. Existe-t-il des normes de programmation générale ?
    Par Matmal11 dans le forum Langages de programmation
    Réponses: 66
    Dernier message: 30/03/2008, 00h18
  2. Réponses: 3
    Dernier message: 07/01/2008, 11h09
  3. Créer des normes de codage sous Eclipse
    Par As2piK dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2007, 19h54
  4. [WinDev 10] Respect des normes de codage
    Par raoudha dans le forum WinDev
    Réponses: 3
    Dernier message: 16/02/2007, 16h06
  5. [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Par Cpt.FLAM dans le forum Valider
    Réponses: 6
    Dernier message: 08/04/2005, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo