🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #11536

Re: Segmentation fault

#11536
From: Ripe/7a69
Date: Wed, 31 Oct 2001 04:39
89 lines
3399 bytes
Fco. Javier Espejo wrote:

>>Por ejemplo, pasan a una funci�n un puntero, que apunta a una zona de la
>>memoria ya alojada. La funci�n no tiene m�s datos. �C�mo saber, a partir
>>
> de
> 
>>ese puntero, y solamente ese puntero, cuanta memoria hay alojada en la
>>direcci�n a la que apunta?
>>
> 
> No se puede saber.
> 
> 
>>Digo yo que tiene que haber alguna manera de saberlo, sin�, �c�mo funciona
>>free?
>>
> 
> Con una tabla de informaci�n, que almacena cada proceso al final de la pila.
> Que no es estandar, ni donde se aloja, es totalmente dependiente del
> compilador usado.
> 
> ---------------------------------
> jespejoYASABES@QUEHACERarrakis.es
> �Sistemas Operativos? �Vis�tala!
> http://www.arrakis.es/~jespejo
> ---------------------------------
> 
> 
> 

Esto no es realmente cierto. Dependera basicamente de la libc. En linux 
se suele usar para el tema free/malloc la implementacion dl-malloc (que 
de echo es la mas usada en el mundo mundial :P). Y si. se puede saber el 
tama�o de una chunk (chunk es un espacio en la heap tratado por 
dl-malloc) mirando el campo size de la chunk, En el campo adeucuado de 
la misma. (me explico muy mal, mirad la implementacion de la libc para 
entenderlo mejor).

---

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

enum chunk_flags {
   PREV_INUSE = 1 << 0,
   IS_MMAPPED = 1 << 1
};

typedef struct malloc_chunk {
   size_t prev_size;
   size_t size;
   struct malloc_chunk* fd;
   struct malloc_chunk* bk;
} *mchunkptr;

#define chunk_offset            (sizeof(size_t) * 2)
#define begin_chunk(mem)        ((mchunkptr) ((mem) - chunk_offset))

#define SIZE_BITS               (PREV_INUSE | IS_MMAPPED)
#define chunksize(p)            ((p)->size & ~(SIZE_BITS))

int main() {
   char *ptr;
   char *ptr2;
   mchunkptr ck;
   mchunkptr ck2;
   ptr=malloc(16);
   ptr2=malloc(256);
   ck=begin_chunk(ptr);
   ck2=begin_chunk(ptr2);
   printf("%i\n", (ck->size-9));
   printf("%i\n", (ck2->size-9));
}

----


$ gcc pr.c -o pr
$ ./pr
16
256
$


Un saludo.

Ripe - www.7a69ezine.org
Technical Details
Message-ID: <3BDF8091.2020101@7a69ezine.NO-ESPAM-HERE.org>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!not-for-mail
References: <lnhip9.bq.ln@xxx.com> <87lmirknsk.fsf@meltdown.ion> <44ejp9.3f1.ln@xxx.com> <878zeqyp6r.fsf@relativistic.ion> <e8gnp9.ku.ln@xxx.com> <3bbf5519_4@news.arrakis.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,b3c8decf211f42e0
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2001-10-30 20:46:10 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!not-for-mail
From: Ripe/7a69 <ripe@7a69ezine.NO-ESPAM-HERE.org>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Segmentation fault
Date: Wed, 31 Oct 2001 05:39:45 +0100
Organization: Wanadoo
Lines: 90
Message-ID: <3BDF8091.2020101@7a69ezine.NO-ESPAM-HERE.org>
References: <lnhip9.bq.ln@xxx.com> <87lmirknsk.fsf@meltdown.ion> <44ejp9.3f1.ln@xxx.com> <878zeqyp6r.fsf@relativistic.ion> <e8gnp9.ku.ln@xxx.com> <3bbf5519_4@news.arrakis.es>
NNTP-Posting-Host: 62-37-172-75.dialup.uni2.es
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: news.wanadoo.es 1004503140 9895 62.37.172.75 (31 Oct 2001 04:39:00 GMT)
X-Complaints-To: usenet@wanadoo.es
NNTP-Posting-Date: Wed, 31 Oct 2001 04:39:00 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.5) Gecko/20011023
X-Accept-Language: en