#include <malloc.h>
#include <stdio.h>
#include <signal.h>
Ce programme détermine pour la machine qui l'exécute :
#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); }