/*************************************************************************************************************************************/
/* */
/* T E S T D E C O R R U P T I O N D E L ' A L L O C A T E U R M E M O I R E : */
/* */
/* */
/* Author of '$xtc/malloc.01$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20051208174231). */
/* */
/*************************************************************************************************************************************/
#define NOMBRE_D_UNITES \
8
#define LONGUEUR_DE_L_UNITE \
4
#define NOMBRE_D_OCTETS_DEMANDES \
(NOMBRE_D_UNITES*LONGUEUR_DE_L_UNITE)
#define NOMBRE_D_OCTETS_EFFECTIFS \
(((((NOMBRE_D_UNITES*LONGUEUR_DE_L_UNITE)+8+(8-1))/8)*8)+1)
extern int *calloc();
main()
{
int *p;
p=calloc(NOMBRE_D_UNITES,LONGUEUR_DE_L_UNITE);
printf("allocation %d (%d) octets : p=0x%0x\n",NOMBRE_D_OCTETS_DEMANDES,NOMBRE_D_OCTETS_EFFECTIFS,p);
printf("p[0]=%d ",*(p+0));
printf("p[1]=%d ",*(p+1));
printf("p[2]=%d ",*(p+2));
printf("p[3]=%d\n",*(p+3));
printf("p[-1]=0x%0x (%d)\n",*(p-1),*(p-1));
printf("p[-2]=0x%0x (%d)\n",*(p-2),*(p-2));
/* L'element 'p[-2]' contient le nombre d'octets d'alloues (NOMBRE_D_OCTETS_DEMANDES plus */
/* les 8 d'en-tete) en multiple de 8 par exces, auquel s'ajoute une unite : */
/* */
/* (((((NOMBRE_D_UNITES*LONGUEUR_DE_L_UNITE)+8+(8-1))/8)*8)+1) */
/* */
/* Le 20051209102851, je note que l'en-tete semble passer 8 a 16 octets dans le cas ou le */
/* mode 'MALLOC_CHECK_' est active ('v $xig/fonct$vv$FON 13x8+1'). */
printf("\n");
p=calloc(NOMBRE_D_UNITES,LONGUEUR_DE_L_UNITE);
printf("allocation %d (%d) octets : p=0x%0x\n",NOMBRE_D_OCTETS_DEMANDES,NOMBRE_D_OCTETS_EFFECTIFS,p);
printf("p[0]=%d ",*(p+0));
printf("p[1]=%d ",*(p+1));
printf("p[2]=%d ",*(p+2));
printf("p[3]=%d\n",*(p+3));
printf("p[-1]=0x%0x (%d)\n",*(p-1),*(p-1));
printf("p[-2]=0x%0x (%d)\n",*(p-2),*(p-2));
printf("\n");
p=calloc(NOMBRE_D_UNITES,LONGUEUR_DE_L_UNITE);
printf("allocation %d (%d) octets : p=0x%0x\n",NOMBRE_D_OCTETS_DEMANDES,NOMBRE_D_OCTETS_EFFECTIFS,p);
printf("p[0]=%d ",*(p+0));
printf("p[1]=%d ",*(p+1));
printf("p[2]=%d ",*(p+2));
printf("p[3]=%d\n",*(p+3));
printf("p[-1]=0x%0x (%d)\n",*(p-1),*(p-1));
printf("p[-2]=0x%0x (%d)\n",*(p-2),*(p-2));
printf("\n");
*(p-1)=0x1234;
/* En activant l'option : */
/* */
/* setenv MALLOC_CHECK_ 1 */
/* */
/* cette instruction va provoquer un message : */
/* */
/* free(): invalid pointer 0x???????! */
/* */
/* du au fait que les 8 octets qui precedent un bloc ne sont pas "neutre"s... On notera */
/* que modifier '*(p-2)' semble sans consequence... */
printf("free p=%d\n",free(p));
printf("p[0]=%d ",*(p+0));
printf("p[1]=%d ",*(p+1));
printf("p[2]=%d ",*(p+2));
printf("p[3]=%d\n",*(p+3));
printf("p[-1]=0x%0x (%d)\n",*(p-1),*(p-1));
printf("p[-2]=0x%0x (%d)\n",*(p-2),*(p-2));
}