/*************************************************************************************************************************************/ /* */ /* 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)); }