Question

J'ai écrit une mémoire assez basique allocateur utilisant sbrk. Je demande un morceau de mémoire, par exemple 65k et dépecer au besoin pour les variables demandant la mémoire dynamique. Je libère la mémoire en ajoutant revenir au bloc 65k. Le bloc 65k est dérivé d'un sizeof d'union (16 octets). Ensuite, j'aligner le bloc le long d'une même limite de 16 octets. Mais je reçois un comportement inhabituel.

Accès à la mémoire apparaît bien que j'allouer et commence à remplir mes structures de données acceptent que sur un de mes appels de fonction, je passe un pointeur vers une variable membre dans une structure globale, mais l'adresse de l'argument pointeur ne correspond pas directement à l'adresse de ce membre.

Par exemple, l'adresse réelle de ce membre particulier se trouve être: 0x100313d50 mais lors de l'exécution y est représenté une fonction particulière (rien de spécial) l'adresse du membre comme 0x100313d70. A l'intérieur du débogueur je peux interroger l'adresse réelle et il semble correct lorsque dans la fonction où cela se manifeste. Ce n'est pas le premier élément étant accessible soit, il est le troisième donc deux accès de mémoire avant sont très bien, mais au cours du troisième accès, je vois ce déplacement hors du commun.

Est-il possible que j'accéder à cette mémoire via un bloc désaligné? Il est possible, mais je voudrais attendre l'obtenir une exception SIGBUS jeté (puce SPARC). Je compile en utilisant 16s -memalign de = il doit SIGBUS au lieu de piégeage et de fixation du mauvais alignement.

Toutes mes structures sont rembourrés sur un multiple de 16 octets: sizeof (structure)% 16 = 0. Quelqu'un at-il eu l'expérience avec ce type de comportement? D'une manière générale, ce genre de choses / stuff / etc. pourrait provoquer un pointeur de falsifier une adresse mémoire?

Cordialement, Tracy.

Solaris 10, SunStudio-12, langage C sur le processeur SPARC moderne (dans le cas où cette aide).

Était-ce utile?

La solution

Je me dis que je dois répondre à ma propre question dans le cas où quelqu'un d'autre là-bas a un problème similaire.

La raison pour laquelle l'adresse de mémoire décalait est parce qu'un appel avant une fonction d'utilité écrasait accidentellement la méta-adresse de la structure globale de réécriture thusly la méta-adresse de ce bloc si lookups sur ce bloc ont été déplacées, même si le réel données résidait encore dans le bloc d'origine.

En mots simples, j'ai écrit passé mon tampon. Depuis que je Distribuez la mémoire de la queue, soufflerait loin d'écraser mon grand besoin de méta-adresse pour ma structure globale (ou autre). Maintenant, je sais ce que le comportement non défini ressemble.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top