Il seguente codice non da errori di compilazione, ma quando lo eseguo mi da uno strano errore, che sembra essere generato dalla funzione free() ( Uso linux con compilatore gcc )
codice:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MOV "mov"
#define PRINT "prt"
int ax = 0;
int bx = 0;
int cx = 0;
int dx = 0;
int mov(const char *data);
void parse(const char *str);
int main(void){
char str[20];
while(1){
printf("[8AVM]>>> ");
fgets(str, 20, stdin);
parse(str);
}
return 0;
}
void parse(const char *str){
char *instruction;
char *data;
if(!(instruction = calloc(3, sizeof(char)))){
printf("Error allocing %s <%p>", instruction);
exit(1);
}
if(!(data = calloc(17, sizeof(char)))){
printf("Error allocing <%p>", data);
exit(1);
}
for(; *str; str++){
if(isspace(*str)){
*instruction = *str;
++instruction;
}
else{
*data = *str;
++data;
}
}
if(strcmp(str, MOV))
mov(data);
else if(strcmp(str, PRINT))
printf("AX = %d\nBX = %d\nCX = %d\nDX = %d\n", ax, bx, cx, dx);
else
printf("The instruction is not recognized\n");
free(data);
free(instruction);
}
int mov(const char *data){
int value;
char *reg;
if(!(reg = calloc(2, sizeof(char)))){
printf("Error allocing <%p>", reg);
exit(1);
}
for(; *data; data++){
if(isalpha(*data) && *data != ','){
*reg = *data;
++reg;
}
else if(isspace(*data))
continue;
else if(isdigit(*data))
value = atoi(data);
}
if(strcmp(reg, "ax"))
ax = value;
else if(strcmp(reg, "bx"))
bx = value;
else if(strcmp(reg, "cx"))
cx = value;
else if(strcmp(reg, "dx"))
dx = value;
else
return 0;
free(reg);
return 1;
}
Errore :
codice:
[8AVM]>>> mov ax, 5
*** glibc detected *** ./8avm: free(): invalid pointer: 0x086a201f ***
======= Backtrace: =========
/lib/libc.so.6[0x4d1e0f18]
/lib/libc.so.6(__libc_free+0x78)[0x4d1e43ef]
./8avm[0x8048714]
./8avm[0x8048578]
/lib/libc.so.6(__libc_start_main+0xdc)[0x4d192724]
./8avm[0x80484b1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 03:01 3862935 /home/marco/Esperimenti/8AVM/8avm
08049000-0804a000 rwxp 00000000 03:01 3862935 /home/marco/Esperimenti/8AVM/8avm
086a2000-086c3000 rwxp 086a2000 00:00 0 [heap]
4d15f000-4d160000 r-xp 4d15f000 00:00 0 [vdso]
4d160000-4d179000 r-xp 00000000 03:01 3600999 /lib/ld-2.4.so
4d179000-4d17a000 r-xp 00018000 03:01 3600999 /lib/ld-2.4.so
4d17a000-4d17b000 rwxp 00019000 03:01 3600999 /lib/ld-2.4.so
4d17d000-4d2aa000 r-xp 00000000 03:01 3601001 /lib/libc-2.4.so
4d2aa000-4d2ac000 r-xp 0012d000 03:01 3601001 /lib/libc-2.4.so
4d2ac000-4d2ad000 rwxp 0012f000 03:01 3601001 /lib/libc-2.4.so
4d2ad000-4d2b0000 rwxp 4d2ad000 00:00 0
4d574000-4d57f000 r-xp 00000000 03:01 3603333 /lib/libgcc_s-4.1.1-20060525.so.1
4d57f000-4d580000 rwxp 0000a000 03:01 3603333 /lib/libgcc_s-4.1.1-20060525.so.1
b7e00000-b7e21000 rw-p b7e00000 00:00 0
b7e21000-b7f00000 ---p b7e21000 00:00 0
b7f88000-b7f8a000 rw-p b7f88000 00:00 0
b7fa7000-b7fa9000 rw-p b7fa7000 00:00 0
bf992000-bf9a8000 rw-p bf992000 00:00 0 [stack]
Abortito