Page principale   Modules   Liste des composants   Liste des fichiers   Composants   Déclarations  

Référence du fichier inspect_stack.c

Programme d'analyse de la pile C. Plus de détails...

#include <malloc.h>
#include <stdio.h>
#include <signal.h>


Description détaillée

Ce programme détermine pour la machine qui l'exécute :

Il génère alors le fichier Cstack.h qui contient les macros définissant la taille minimum de pile, le calcul d'une taille de pile viable et le calcul d'un pointeur de pile à partir d'une adresse de bloc libre.

#include <malloc.h>
#include <stdio.h>
#include <signal.h>
int minFrame; int minStack; 
int pushdownstack; /* sens de croissance de la pile :  
    1 des adresses hautes vers basses
    0 des adresses  basses vers hautes 
*/
/*******************************************************              
* Analyse de la pile (sens de croissance .. taille trame min. etc..
*********************************************************/                 
char* mark0; /* première marque */
char * mark1; /* seconde  marque */
void setMark1(int * pt){ int c; mark1=(char*)&c;}
void  setMinFrame(int * pt){ setMark1(pt);}
void setMark0(){ int c; mark0=(char*)&c;setMinFrame(&c);}

int  main(){
  FILE *f;
  f=fopen("Cstack.h","w");
  fprintf(f,"/* fichier généré par inspect_stack.c : NE PAS TOUCHER */ \n"   );
  /* génération documentation pour doxygen */
  fprintf(f,"/*! \\file Cstack.h \n"   );
  fprintf(f,"\\brief Inclusion de gestion de pile C \n \n"   );
  fprintf(f,"Le fichier Cstack.h  contient les macros   définissant la taille minimum de pile #FredMIN_STACK , la taille minimum de trame #FredMIN_FRAME , le calcul d'une taille de pile viable FredSTACK_SIZE() et le calcul d'un pointeur de pile à partir d'une adresse de bloc libre FredMAKE_SP() .\n");
  fprintf(f,"*/ \n"   );

  /* calcul taille pile pour traitement d'un signal */
  minStack=SIGSTKSZ;
  fprintf(f,"/*! \\brief Taille minimum de pile de thread  \n"   );
  fprintf(f,"*/ \n"   );
  fprintf(f,"#define FredMIN_STACK %d \n",SIGSTKSZ   );
  printf(" taille pile signal min %d \n",SIGSTKSZ );
  /* calcul de la plus petite trame de procédure et sens de croissance*/
  setMark0();
  if( mark0 > mark1 ){ 
    pushdownstack=1; 
    minFrame= mark0-mark1;
    printf(" pile decroissante et trame minimum %d \n", minFrame);
    fprintf(f,"/*! \\brief Taille minimum de trame de procédure C  \n"   );
    fprintf(f,"*/ \n"   );
    fprintf(f,"#define FredMIN_FRAME %d \n", minFrame  );
    fprintf(f,"/*! \\brief Calcul d'une taille de pile correcte  \n"   );
    fprintf(f,"*/ \n"   );
    fprintf(f,"#define FredSTACK_SIZE(sz) (((FredMIN_STACK>(sz))?FredMIN_STACK:(sz))+FredMIN_FRAME)    \n"  );
    fprintf(f,"/*! \\brief Calcul du pointeur de pile  \n"   );
    fprintf(f,"*/ \n "   );
    fprintf(f,"#define FredMAKE_SP(a,sz) ((a)+(sz))  \n"  );
  }else if ( mark0 < mark1 ){
    pushdownstack=0; 
    minFrame= mark1-mark0;
    printf(" pile croissante et trame minimum %d \n", minFrame);
    fprintf(f,"/*! \\brief Taille minimum de trame de procédure C  \n"   );
    fprintf(f,"*/ \n"   );
    fprintf(f,"#define FredMIN_FRAME %d \n", minFrame  );
    fprintf(f,"/*! \\brief Calcul d'une taille de pile correcte  \n"   );
    fprintf(f,"*/ \n"   );
    fprintf(f,"#define FredSTACK_SIZE(sz) (((FredMIN_STACK>(sz))?FredMIN_STACK:(sz))+FredMIN_FRAME)    \n"  );
    fprintf(f,"/*! \\brief Calcul du pointeur de pile  \n"   );
    fprintf(f,"*/ \n"   );
    fprintf(f,"#define FredMAKE_SP(a,sz) (a)  \n"  );
  }else printf( " PB inspection de pile ");
    fclose(f);
}


Généré le Mon Jan 5 16:22:06 2004 par doxygen1.2.17