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



Copyright © Jean-François Colonna, 2021-2023.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2021-2023.