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

  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 485
    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 485
    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 485
    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 485
    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.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    As-tu essayé de rajouter restrict ?
    Peut-on voir également les options que tu passes à GCC ?

  10. #10
    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
    Pas sur de savoir faire ce qu'il faut.
    J'ai tenté ça :

    (Idiot, mais quand on maitrise pas ...)
    #define __restrict
    ou
    #define restrict

    Puis
    struct sockaddr *__restrict;
    #include <sys/types.h>
    #include <sys/socket.h>
    ou
    #include <sys/types.h>
    struct sockaddr *__restrict;
    #include <sys/socket.h>

    Ca marche pas.
    Cerveau pas trop présent ce soir.
    Peux-tu me guider STP ? Merci

    EDIT:
    Extrait du makefile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CC		= /usr/local/cross/gcc-3.3.4_glibc-2.3.2/arm-linux/bin/gcc
    CFLAGS	= -std=c99 -W -Wall -fPIC -pedantic -Os
    LDFLAGS	= -ldl -shared

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Mais non ! restrict est un mot-clé du C (99). __restrict sans doute un synonyme de restrict spécifique à gcc.

  12. #12
    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
    Wouh !!
    Bien fatigué moi, hier soir !!


    Bon, on oublie les bêtises que j'ai pu écrire et on reprend.

    J'ai fini par faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <sys/types.h>
    #undef __USE_GNU
    #include <sys/socket.h> 
    #define __USE_GNU
    mais à bout d'arguments pour parvenir à forcer les premières formes de déclarations dans socket.h:
    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 *
    Est-ce acceptable ou trop moche et dois-je faire autre chose de plus propre ?

    J'ai lu ça, mais ça ne m'a pas aidé, si ça peut vous aider à m'orienter :
    http://www.lysator.liu.se/c/restrict.html
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34885
    http://old.nabble.com/restrict-keywo...d26596271.html


    Merci pour votre aide.

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    Est-ce que ça change quelque chose si tu déclares tes fonctions de cette façon (en oubliant les #define et #undef)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int bind(int sockfd, const struct sockaddr * restrict my_addr, socklen_t addrlen) {
    ...
    }

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <sys/types.h>
    #undef __USE_GNU
    #include <sys/socket.h> 
    #define __USE_GNU
    Ce serait plus correct de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <sys/types.h>
    #ifdef __USE_GNU 
    #undef __USE_GNU
    #define MY_WORKAROUND
    #endif
    #include <sys/socket.h> 
    #ifdef MY_WORKAROUND
    #define __USE_GNU
    #endif

  15. #15
    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
    Envoyé par Obsidian
    Citation:
    Est-ce que ça change quelque chose si tu déclares tes fonctions de cette façon (en oubliant les #define et #undef)
    C'est ce que j'avais fait avant d'en venir aux #define et #undef.

    J'avais testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int bind(int sockfd, const struct sockaddr * restrict my_addr, socklen_t addrlen) {
    ...
    int bind(int sockfd, const struct sockaddr * __restrict my_addr, socklen_t addrlen) {
    ...
    int bind(int sockfd, const struct sockaddr * __restrict__ my_addr, socklen_t addrlen) {
    ...
    int bind(int sockfd, __CONST_SOCKADDR_ARG *my_addr, socklen_t addrlen) {
    ...
    int bind(int sockfd, __CONST_SOCKADDR_ARG my_addr, socklen_t addrlen) {
    ...
    sans succès.

  16. #16
    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
    Bonsoir,

    Donc j'ai reste au workaround ou une idée plus élégante est-elle proposable ?!

    Merci pour votre aide.

+ 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