Interpreteur seécurisé terminé

This commit is contained in:
Paul Faure 2021-06-18 14:14:06 +02:00
parent 9c38352e61
commit c9c60001de

View file

@ -4,6 +4,7 @@
#define TAILLE_BUFFER_INSTRUCTIONS (1024) #define TAILLE_BUFFER_INSTRUCTIONS (1024)
#define TAILLE_MEMOIRE (64) #define TAILLE_MEMOIRE (64)
#define TAILLE_PILE_APPELS (16)
/**************************************************/ /**************************************************/
@ -32,6 +33,12 @@ int mem[TAILLE_MEMOIRE];
// Pointeur de base dans la mémoire // Pointeur de base dans la mémoire
int ebp = 0; int ebp = 0;
// Memoire du programme
int pile[TAILLE_PILE_APPELS];
// Pointeur de sommet dans la pile d'appel
int esp = 0;
@ -57,6 +64,15 @@ int check_adresse(int adresse) {
return adresse; return adresse;
} }
// Verifie que les limites de la mémoire d'appels ne sont pas franchies
int check_adresse_pile(int adresse) {
if (adresse >= TAILLE_PILE_APPELS || adresse < 0) {
printf("\033[31;01m ERROR : \033[00m Stack error\n");
exit(2);
}
return adresse;
}
// Verifie que eip ne depasse pas la taille du buffer // Verifie que eip ne depasse pas la taille du buffer
int check_eip(int eip) { int check_eip(int eip) {
if (eip >= TAILLE_BUFFER_INSTRUCTIONS) { if (eip >= TAILLE_BUFFER_INSTRUCTIONS) {
@ -175,14 +191,18 @@ void execute() {
printf("%d@%d\n", mem[check_adresse(ebp + programme[eip].param1)], ebp + programme[eip].param1); printf("%d@%d\n", mem[check_adresse(ebp + programme[eip].param1)], ebp + programme[eip].param1);
} else if (programme[eip].instruction == CALL) { } else if (programme[eip].instruction == CALL) {
mem[check_adresse(ebp + programme[eip].param2)] = ebp; pile[check_adresse_pile(esp)] = ebp;
mem[check_adresse(ebp + programme[eip].param2 + 1)] = eip + 1; esp++;
ebp = ebp + programme[eip].param2 + 2; pile[check_adresse_pile(esp)] = eip + 1;
esp++;
ebp = ebp + programme[eip].param2;
eip = programme[eip].param1 - 1; eip = programme[eip].param1 - 1;
} else if (programme[eip].instruction == RET) { } else if (programme[eip].instruction == RET) {
eip = mem[check_adresse(ebp - 1)] - 1; esp--;
ebp = mem[check_adresse(ebp - 2)]; eip = pile[check_adresse_pile(esp)] - 1;
esp--;
ebp = pile[check_adresse_pile(esp)];
} else if (programme[eip].instruction == STOP) { } else if (programme[eip].instruction == STOP) {
if (programme[eip].param1 == 0) { if (programme[eip].param1 == 0) {