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 :

[Pointer integer different size] 64 bits ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 6
    Par défaut [Pointer integer different size] 64 bits ?
    Bonjour,

    la machine : ia64 SuseLinux

    J'ai compilé un code avec gcc sous environnement 64 bits.
    gcc -v :Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit ia64-suse-linuxThread model: posix
    gcc version 3.3.3 (SuSE Linux)
    Lors de l'execution j'ai le plantage suivant
    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image PC Routine Line Source
    libc.so.6.1 2000000000C201F0 Unknown Unknown Unknown
    Après passage dans gdb, je vois que le plantage vient de la libraire : xvertex.5.0 routine rotate.c au niveau de l'utilisation de strcpy.

    Si dessous le bout de code de rotate.c qui plante :
    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
    /**************************************************************************/
    /* Routine to mimic `strdup()' (some machines don't have it)              */
    /**************************************************************************/
    
    static char *my_strdup(str)
        char *str;
    {
        char *s;
        
        if(str==NULL)
    	return NULL;
        
        s=(char *)malloc((unsigned)(sizeof(str)+1));
        if(s!=NULL) 
         strcpy(s, str);
        
        return s;
    }
    Lors de la compilation de rotate.c j'ai le message suivant :
    rotated.c:168: warning: cast to pointer from integer of different size
    correspondant à la ligne en bleu dans le bout de code au-dessus.

    Après un peu de recherche sur internet, ça pourrait provenir de la compilation en 64 bits qui laisse le entier en 32 bits et le pointeur en 64 bits. Mais bon, j'ai très peu de connaissance en C, malloc, pointeur.

    Si quelqu'un aurait une idée de comment s'en sortir, ça serait très sympa.

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je parie que tu as oublié de déclarer malloc() en incluant <stdlib.h>.

    Et ce code est excécrable:
    • En 32 bits, l'erreur serait passée inaperçu. C'est justement pour ça qu'on ne caste pas le retour de malloc() en C.
    • sizeof(str) retourne la taille du pointeur. Il faut utiliser la fonction strlen().
    • Les déclarations de fonction style K&R, c'est obsolète.
    • str devrait être un pointeur const, puisque la fonction ne modifie pas la chaîne.
    • malloc() prend déjà un size_t en paramètre: Il faut donc retirer le cast du sizeof en unsigned int.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code C correct : 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
    (tout en haut)
    #include <stdlib.h>
    #include <string.h>
     
    /**************************************************************************/
    /* Routine to mimic `strdup()' (some machines don't have it) */
    /**************************************************************************/
     
    static char *my_strdup(char const *str)
    {
    	char *s;
     
    	if(str==NULL)
    		return NULL;
     
    	s = malloc(strlen(str)+1);
    	if(s!=NULL)
    		strcpy(s, str);
     
    	return s;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 6
    Par défaut
    Merci pour ces réponses.
    Si je rajoute les bonnes déclarations des librairies en entête ça semble marcher.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un conseil, profites-en pour corriger aussi le reste de la fonction...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    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
    Par défaut
    Citation Envoyé par earl29 Voir le message
    Merci pour ces réponses.
    Si je rajoute les bonnes déclarations des librairies en entête ça semble marcher.
    Ca ne suffit pas. Il fait corriger ce qui a été signalé. 'semble marcher' ça ne veut rien dire.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 6
    Par défaut
    1/ Le sizeof est un test de ma part mais le code contient strlen. J'ai malencontreusement posté le code avec mon test => ok pour l'erreur mais j'y connais rien C;

    2/ la librairie date des années 80 d'où le codage qui n'est pas à la "norme" !!!

    3/ le prog complet a toujours été utilisé sur des machines 32 bits. C'est seulement depuis les tests en compilation 64 bits que le problème de segmentation apparait.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Cela vient que tu n'inclus pas stdlib.h qui fourni le prototype correct de malloc.
    En passant ajoute -Wmissing-prototypes a tes options et fixe tous les warnings qui en resultent.

  9. #9
    Expert éminent
    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
    Par défaut
    Citation Envoyé par earl29 Voir le message
    Si dessous le bout de code de rotate.c qui plante :
    Ce style de codage est déprécié depuis 1989, date de la publication de la version ANSI de la spec du C, reprise en 1990 par l'ISO (C90).

    Il y a un bug dans ton code. La taille allouée est fausse. C'est pas sizeof (taille du pointeur), mais strlen() (longueur de la chaine).

    Faut pas aller chercher des choses compliquées (32-bit/64-bit, rien à voir...). Il faut commencer par écrire du code correct.

    Ce code fonctionne :
    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
     
    #include <stdlib.h>
     
    ...
     
    static char *my_strdup (char const *str)
    {
       char *s;
     
       if (str == NULL)
          return NULL;
     
       s = malloc (strlen (str) + 1);
       if (s != NULL)
          strcpy (s, str);
     
       return s;
    }
    Mais je préfère éviter les return multiples :
    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
     
    #include <stdlib.h>
     
    ...
     
    /* Routine to mimic `strdup()' (some machines don't have it) */
    static char *my_strdup (char const *str)
    {
       char *s = NULL;
     
       if (str != NULL)
       {
          size_t size = strlen (str) + 1;
     
          s = malloc (size);
     
          if (s != NULL)
          {
             memcpy (s, str, size);
          }
       }
       return s;
    }

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

Discussions similaires

  1. integer overflow(depassement de bit)
    Par chekkal dans le forum Firebird
    Réponses: 4
    Dernier message: 15/12/2014, 05h58
  2. Réponses: 3
    Dernier message: 05/03/2012, 00h54
  3. Réponses: 8
    Dernier message: 21/12/2009, 15h16
  4. Réponses: 4
    Dernier message: 06/08/2007, 22h46
  5. [Delphi 7] Transtypage d'un pointer objet vers un integer
    Par raoulmania dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2005, 14h28

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