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 :

Addition de pointeur donne résultats incohérents


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Addition de pointeur donne résultats incohérents
    Bonjour à tous.
    Je travaille sur un projet qui me demande de manipuler des pointeur (recoder objdump), et je rencontre un problème : additionner un int a pointeur pour se déplacer donne un résultat incohérent. Concrètement dans l'exemple je récupère un pointeur et un offset pour trouver l'emplacement d'une autre structure, mais le résultat de l'addition est incohérent.
    le pointeur en question est une structure Elf32 et l'offset un e_offset, mais ça ne change rien, j'avais déjà eu ce problème sur un précédent projet et j'avais contourné le problème avec un hack pourris dont je ne me souviens plus, mais de toute façon la c'est beaucoup plus gros il me faut une vrai solution.
    Les types sont ceux définis dans le header elf32, je code sous FreeBSD et compile avec gcc.
    Un (le) morceau de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     Elf32_hdr        *head;
     Elf32_Phdr	 *proghead;
     
     head = qqchose;
     proghead = head + (head->e_phoff); /* e_phoff est l'offset en question*/
    (l'offset est de type unsigned int)

    Vu sous gdb:
    $gdb p head;
    0x804a008

    $gdb p proghead
    0x804aa98

    $gdb p head->e_phoff
    52 /*soit 0x34 en hexadecimale*/



    Avec des printf("%p", ...) dans le code le résultat est le même.
    J'ai essayé plusieurs cast, rien n'y fait, ça me rend fou et me fait perdre un temps fou aussi. J'ai déjà recherché sur internet mais je ne trouve aucun résultat pertinent.
    Sinon petite déduction :
    0x804aa98 - 0x804a008 = 0xA90, soit 0x34 (52) au carré.
    Je pense qu'il y du décalage de bit, les valeurs ne doivent pas additionné comme il me semble que cela devrait-être, des bits doivent être interprétés comme des bits de signature ou je ne sais pas, bref un truc passe pas.


    Merci beaucoup d'avance.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Elf32_hdr        *head;
     Elf32_Phdr	 *proghead;
     
     head = qqchose;
     proghead = head + (head->e_phoff);
    - mais si tu regardes le contenu des pointeurs, le résultat doit dépendre de sizeof(Elf32_hdr ).
    - Le résultat de la somme est du type Elf32_hdr * que tu ranges à tes risques et périls dans un Elf32_Phdr*
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hio,

    Tu t'es fait piéger par l'arithmétique des pointeurs.

    Soit p un pointeur sur un type de taille N.

    Quand on ajoute une valeur entière x à p, on ajoute en fait N*x
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok merci à tous.
    Le pire c'est que maintenant que vous me le dîtes en effet j'ai dû le voir en diagonal sur mes sites ,mais dans la précipitation j'ai pas fait le lien :/
    Désolé d'avoir posté pour un truc aussi basique, et merci encore pour votre aide.
    Et longue vie à développez.com

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

Discussions similaires

  1. [MySQL] Trou de mémoire : repositionner le pointeur de résultat
    Par riete dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2007, 17h21
  2. [Tableaux] in_array donne résultats inattendus
    Par renaud26 dans le forum Langage
    Réponses: 1
    Dernier message: 05/12/2007, 10h39
  3. Résultat incohérent en utilisant NLS_DATE_LANGUAGE
    Par Liberte Outremer dans le forum SQL
    Réponses: 2
    Dernier message: 25/06/2007, 17h16
  4. Réponses: 1
    Dernier message: 07/02/2006, 12h52
  5. Résultat incohérent de pow, sqrt
    Par PierrotY dans le forum C++
    Réponses: 15
    Dernier message: 16/03/2005, 12h07

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