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 :

warning: function types not truly compatible in ISO C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 41
    Par défaut warning: function types not truly compatible in ISO C
    Bonjour,

    Et encore une !

    Voici le prototype de trois fonctions que je trouve dans socket.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    /* This is the type we use for generic socket address arguments.
     
       With GCC 2.7 and later, the funky union causes redeclarations or
       uses with any of the listed types to be allowed without complaint.
       G++ 2.7 does not support transparent unions so there we want the
       old-style declaration, too.  */
    #if defined __cplusplus || !__GNUC_PREREQ (2, 7) || !defined __USE_GNU
    # define __SOCKADDR_ARG		struct sockaddr *__restrict
    # define __CONST_SOCKADDR_ARG	__const struct sockaddr *
    #else
    /* Add more `struct sockaddr_AF' types here as necessary.
       These are all the ones I found on NetBSD and Linux.  */
    # define __SOCKADDR_ALLTYPES \
      __SOCKADDR_ONETYPE (sockaddr) \
      __SOCKADDR_ONETYPE (sockaddr_at) \
      __SOCKADDR_ONETYPE (sockaddr_ax25) \
      __SOCKADDR_ONETYPE (sockaddr_dl) \
      __SOCKADDR_ONETYPE (sockaddr_eon) \
      __SOCKADDR_ONETYPE (sockaddr_in) \
      __SOCKADDR_ONETYPE (sockaddr_in6) \
      __SOCKADDR_ONETYPE (sockaddr_inarp) \
      __SOCKADDR_ONETYPE (sockaddr_ipx) \
      __SOCKADDR_ONETYPE (sockaddr_iso) \
      __SOCKADDR_ONETYPE (sockaddr_ns) \
      __SOCKADDR_ONETYPE (sockaddr_un) \
      __SOCKADDR_ONETYPE (sockaddr_x25)
     
    # define __SOCKADDR_ONETYPE(type) struct type *__restrict __##type##__;
    typedef union { __SOCKADDR_ALLTYPES
    	      } __SOCKADDR_ARG __attribute__ ((__transparent_union__));
    # undef __SOCKADDR_ONETYPE
    # define __SOCKADDR_ONETYPE(type) __const struct type *__restrict __##type##__;
    typedef union { __SOCKADDR_ALLTYPES
    	      } __CONST_SOCKADDR_ARG __attribute__ ((__transparent_union__));
    # undef __SOCKADDR_ONETYPE
    #endif
     
    extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
         __THROW;
     
    /* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
       For connectionless socket types, just set the default address to send to
       and the only address from which to accept transmissions.
       Return 0 on success, -1 for errors.  */
    extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
         __THROW;
     
    /* Read N bytes into BUF from socket FD.
       Returns the number read or -1 for errors.  */
    extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags)
         __THROW;
    et voici l'utilisation que j'en fais et qui produit le message d'erreur du titre, le même pour chacune des trois fonctions, incompréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) {
    ...
    }
     
    int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) {
    ...
    }
     
    ssize_t recv(int s, void *buf, size_t len, int flags) {
    ...
    }
    Je ne trouve pas ce qui peut produire cette erreur, tout me semble correct.
    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Je suppose que le code que tu donnes n'est pas ton code exact, puisque ce ne sont pas des appels de fonction. Donne plutôt ton code exact.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 41
    Par défaut
    Ben si, c'est mon code qui sera exécuté dans un hook dans une lib chargée via LD_PRELOAD au démarrage du système.

    Tout fonctionne bien, mais j'ai ces warnings que je ne sais pas supprimer.

    Pour le modèle d'appel, voir le squelette dans le topic suivant :
    http://www.developpez.net/forums/d11...nter-and-void/

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par TomTom68 Voir le message
    Je ne trouve pas ce qui peut produire cette erreur, tout me semble correct.
    Avec quelle version de gcc tournes-tu ?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Tu n'aurais pas oublié d'inclure <sys/types.h> avant <socket.h> ?

    Le second utilise des noms de types qui sont définis dans le premier. Posix 2001 les établit d'emblée, mais les autres programmes doivent le faire explicitement.

    Citation Envoyé par man page
    NOTES

    1 POSIX.1-2001 ne requiert pas l'inclusion de <sys/types.h>, et cet en‐tête n'est pas nécessaire sous Linux. Cependant, il doit être inclus sous certaines implémentations historiques (BSD), et les applications portables devraient probablement l'utiliser.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 41
    Par défaut
    Bonne idée, mais j'ai pourtant bien mis types.h avant socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <sys/types.h>
    #include <sys/socket.h>
    gcc-3.3.4 glibc-2.3.2


    EDIT:

    Voilà où j'en suis :
    J'ai lu çà :
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34885

    De là, j'en suis venu à tester ça :
    Modif de socket.h
    #if defined __cplusplus || !__GNUC_PREREQ (2, 7) || !defined __USE_GNU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # define __SOCKADDR_ARG		struct sockaddr *__restrict
    # define __CONST_SOCKADDR_ARG	__const struct sockaddr *
    #else
    /* Add more `struct sockaddr_AF' types here as necessary.
    These are all the ones I found on NetBSD and Linux. */
    # define __SOCKADDR_ALLTYPES \
    __SOCKADDR_ONETYPE (sockaddr) \
    __SOCKADDR_ONETYPE (sockaddr_at) \
    __SOCKADDR_ONETYPE (sockaddr_ax25) \
    __SOCKADDR_ONETYPE (sockaddr_dl) \
    __SOCKADDR_ONETYPE (sockaddr_eon) \
    __SOCKADDR_ONETYPE (sockaddr_in) \
    __SOCKADDR_ONETYPE (sockaddr_in6) \
    __SOCKADDR_ONETYPE (sockaddr_inarp) \
    __SOCKADDR_ONETYPE (sockaddr_ipx) \
    __SOCKADDR_ONETYPE (sockaddr_iso) \
    __SOCKADDR_ONETYPE (sockaddr_ns) \
    __SOCKADDR_ONETYPE (sockaddr_un) \
    __SOCKADDR_ONETYPE (sockaddr_x25)

    # define __SOCKADDR_ONETYPE(type) struct type *__restrict __##type##__;
    typedef union { __SOCKADDR_ALLTYPES
    } __SOCKADDR_ARG __attribute__ ((__transparent_union__));
    # undef __SOCKADDR_ONETYPE
    # define __SOCKADDR_ONETYPE(type) __const struct type *__restrict __##type##__;
    typedef union { __SOCKADDR_ALLTYPES
    } __CONST_SOCKADDR_ARG __attribute__ ((__transparent_union__));
    # undef __SOCKADDR_ONETYPE
    #endif
    Et là, plus de warning !!!

    Encore plus profondément dans l'incompréhension, je compile du C pur et comme le work around GCC date de 2008, je devrais savoir faire ma compilation proprement en 2011, sans avoir à bidouiller socket.h.

    Un petit coup de main, merci.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par TomTom68 Voir le message
    gcc-3.3.4 glibc-2.3.2
    Sans être complètement obsolète, ça commence à être un peu vieux. À l'heure à laquelle j'écris, on en est à GCC 4.6.1 : http://gcc.gnu.org/

    Sinon, ton message d'erreur se produit à quel endroit ? Je pense que c'est principalement l'absence du mot-clé restrict, présent dans le *.h, qui provoque une différence suffisamment subtile pour que le compilo t'avertisse en mode pedantic.

    Pour info, la ligne à l'origine de ce message : http://www.open64.net/doc/df/dc0/kgc...ce.html#l00430

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 41
    Par défaut
    Ben c'est vieux, mais c'est la toolchain de compilation de Tomtom !

    Si tu me dis que je peux compiler avec plus récent sans perte de compatibilité avec le core, je veux bien, mais je ne suis pas assez avancé dans ce genre de choix pour m'auto-déterminer sur ce point.

    Tu verrais un moyen propre de contourner ce warning inutile ?

    Pour info, le message se produit sur la déclaration de chaque fonction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/03/2011, 09h56
  2. Réponses: 13
    Dernier message: 31/05/2006, 14h31
  3. "function does not take 0 parameters"
    Par beb30 dans le forum C
    Réponses: 4
    Dernier message: 31/03/2006, 20h56
  4. Réponses: 5
    Dernier message: 13/03/2006, 15h51
  5. [Double][NaN] identification d'un Type Not A Number
    Par bahamouth dans le forum Langage
    Réponses: 2
    Dernier message: 12/11/2004, 17h06

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