From b4f899e55784cf6f84e530a3a704f63112e73686 Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Thu, 6 Jun 2019 22:05:30 +0700 Subject: [PATCH 1/5] pawndisasm: Remove unused data from the opcode table --- source/compiler/pawndisasm.c | 317 +++++++++++++++++------------------ 1 file changed, 158 insertions(+), 159 deletions(-) diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index 7d6532f..b261468 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -54,170 +54,169 @@ cell do_symbol(FILE *ftxt,const cell *params,cell opcode,cell cip); typedef struct { - cell opcode; char *name; OPCODE_PROC func; } OPCODE; static OPCODE opcodelist[] = { - { 0, "???", parm0 }, - { 1, "load.pri", parm1 }, - { 2, "load.alt", parm1 }, - { 3, "load.s.pri", parm1 }, - { 4, "load.s.alt", parm1 }, - { 5, "lref.pri", parm1 }, - { 6, "lref.alt", parm1 }, - { 7, "lref.s.pri", parm1 }, - { 8, "lref.s.alt", parm1 }, - { 9, "load.i", parm0 }, - { 10, "lodb.i", parm1 }, - { 11, "const.pri", parm1 }, - { 12, "const.alt", parm1 }, - { 13, "addr.pri", parm1 }, - { 14, "addr.alt", parm1 }, - { 15, "stor.pri", parm1 }, - { 16, "stor.alt", parm1 }, - { 17, "stor.s.pri", parm1 }, - { 18, "stor.s.alt", parm1 }, - { 19, "sref.pri", parm1 }, - { 20, "sref.alt", parm1 }, - { 21, "sref.s.pri", parm1 }, - { 22, "sref.s.alt", parm1 }, - { 23, "stor.i", parm0 }, - { 24, "strb.i", parm1 }, - { 25, "lidx", parm0 }, - { 26, "lidx.b", parm1 }, - { 27, "idxaddr", parm0 }, - { 28, "idxaddr.b", parm1 }, - { 29, "align.pri", parm1 }, - { 30, "align.alt", parm1 }, - { 31, "lctrl", parm1 }, - { 32, "sctrl", parm1 }, - { 33, "move.pri", parm0 }, - { 34, "move.alt", parm0 }, - { 35, "xchg", parm0 }, - { 36, "push.pri", parm0 }, - { 37, "push.alt", parm0 }, - { 38, "push.r", parm1 }, /* obsolete (never generated) */ - { 39, "push.c", parm1 }, - { 40, "push", parm1 }, - { 41, "push.s", parm1 }, - { 42, "pop.pri", parm0 }, - { 43, "pop.alt", parm0 }, - { 44, "stack", parm1 }, - { 45, "heap", parm1 }, - { 46, "proc", do_proc }, - { 47, "ret", parm0 }, - { 48, "retn", parm0 }, - { 49, "call", do_call }, - { 50, "call.pri", parm0 }, - { 51, "jump", do_jump }, - { 52, "jrel", parm1 }, /* same as jump, since version 10 */ - { 53, "jzer", do_jump }, - { 54, "jnz", do_jump }, - { 55, "jeq", do_jump }, - { 56, "jneq", do_jump }, - { 57, "jless", do_jump }, - { 58, "jleq", do_jump }, - { 59, "jgrtr", do_jump }, - { 60, "jgeq", do_jump }, - { 61, "jsless", do_jump }, - { 62, "jsleq", do_jump }, - { 63, "jsgrtr", do_jump }, - { 64, "jsgeq", do_jump }, - { 65, "shl", parm0 }, - { 66, "shr", parm0 }, - { 67, "sshr", parm0 }, - { 68, "shl.c.pri", parm1 }, - { 69, "shl.c.alt", parm1 }, - { 70, "shr.c.pri", parm1 }, - { 71, "shr.c.alt", parm1 }, - { 72, "smul", parm0 }, - { 73, "sdiv", parm0 }, - { 74, "sdiv.alt", parm0 }, - { 75, "umul", parm0 }, - { 76, "udiv", parm0 }, - { 77, "udiv.alt", parm0 }, - { 78, "add", parm0 }, - { 79, "sub", parm0 }, - { 80, "sub.alt", parm0 }, - { 81, "and", parm0 }, - { 82, "or", parm0 }, - { 83, "xor", parm0 }, - { 84, "not", parm0 }, - { 85, "neg", parm0 }, - { 86, "invert", parm0 }, - { 87, "add.c", parm1 }, - { 88, "smul.c", parm1 }, - { 89, "zero.pri", parm0 }, - { 90, "zero.alt", parm0 }, - { 91, "zero", parm1 }, - { 92, "zero.s", parm1 }, - { 93, "sign.pri", parm0 }, - { 94, "sign.alt", parm0 }, - { 95, "eq", parm0 }, - { 96, "neq", parm0 }, - { 97, "less", parm0 }, - { 98, "leq", parm0 }, - { 99, "grtr", parm0 }, - {100, "geq", parm0 }, - {101, "sless", parm0 }, - {102, "sleq", parm0 }, - {103, "sgrtr", parm0 }, - {104, "sgeq", parm0 }, - {105, "eq.c.pri", parm1 }, - {106, "eq.c.alt", parm1 }, - {107, "inc.pri", parm0 }, - {108, "inc.alt", parm0 }, - {109, "inc", parm1 }, - {110, "inc.s", parm1 }, - {111, "inc.i", parm0 }, - {112, "dec.pri", parm0 }, - {113, "dec.alt", parm0 }, - {114, "dec", parm1 }, - {115, "dec.s", parm1 }, - {116, "dec.i", parm0 }, - {117, "movs", parm1 }, - {118, "cmps", parm1 }, - {119, "fill", parm1 }, - {120, "halt", parm1 }, - {121, "bounds", parm1 }, - {122, "sysreq.pri", parm0 }, - {123, "sysreq.c", do_sysreq }, - {124, "file", do_file }, - {125, "line", parm2 }, - {126, "symbol", do_symbol }, - {127, "srange", parm2 }, /* version 1 */ - {128, "jump.pri", parm0 }, /* version 1 */ - {129, "switch", do_switch }, /* version 1 */ - {130, "casetbl", casetbl }, /* version 1 */ - {131, "swap.pri", parm0 }, /* version 4 */ - {132, "swap.alt", parm0 }, /* version 4 */ - {133, "push.adr", parm1 }, /* version 4 */ - {134, "nop", parm0 }, /* version 6 */ - {135, "sysreq.n", parm2 }, /* version 9 (replaces SYSREQ.d from earlier version) */ - {136, "symtag", parm1 }, /* version 7 */ - {137, "break", parm0 }, /* version 8 */ - {138, "push2.c", parm2 }, /* version 9 */ - {139, "push2", parm2 }, /* version 9 */ - {140, "push2.s", parm2 }, /* version 9 */ - {141, "push2.adr", parm2 }, /* version 9 */ - {142, "push3.c", parm3 }, /* version 9 */ - {143, "push3", parm3 }, /* version 9 */ - {144, "push3.s", parm3 }, /* version 9 */ - {145, "push3.adr", parm3 }, /* version 9 */ - {146, "push4.c", parm4 }, /* version 9 */ - {147, "push4", parm4 }, /* version 9 */ - {148, "push4.s", parm4 }, /* version 9 */ - {149, "push4.adr", parm4 }, /* version 9 */ - {150, "push5.c", parm5 }, /* version 9 */ - {151, "push5", parm5 }, /* version 9 */ - {152, "push5.s", parm5 }, /* version 9 */ - {153, "push5.adr", parm5 }, /* version 9 */ - {154, "load.both", parm2 }, /* version 9 */ - {155, "load.s.both",parm2 }, /* version 9 */ - {156, "const", parm2 }, /* version 9 */ - {157, "const.s", parm2 }, /* version 9 */ + { /* 0*/ "???", parm0 }, + { /* 1*/ "load.pri", parm1 }, + { /* 2*/ "load.alt", parm1 }, + { /* 3*/ "load.s.pri", parm1 }, + { /* 4*/ "load.s.alt", parm1 }, + { /* 5*/ "lref.pri", parm1 }, + { /* 6*/ "lref.alt", parm1 }, + { /* 7*/ "lref.s.pri", parm1 }, + { /* 8*/ "lref.s.alt", parm1 }, + { /* 9*/ "load.i", parm0 }, + { /* 10*/ "lodb.i", parm1 }, + { /* 11*/ "const.pri", parm1 }, + { /* 12*/ "const.alt", parm1 }, + { /* 13*/ "addr.pri", parm1 }, + { /* 14*/ "addr.alt", parm1 }, + { /* 15*/ "stor.pri", parm1 }, + { /* 16*/ "stor.alt", parm1 }, + { /* 17*/ "stor.s.pri", parm1 }, + { /* 18*/ "stor.s.alt", parm1 }, + { /* 19*/ "sref.pri", parm1 }, + { /* 20*/ "sref.alt", parm1 }, + { /* 21*/ "sref.s.pri", parm1 }, + { /* 22*/ "sref.s.alt", parm1 }, + { /* 23*/ "stor.i", parm0 }, + { /* 24*/ "strb.i", parm1 }, + { /* 25*/ "lidx", parm0 }, + { /* 26*/ "lidx.b", parm1 }, + { /* 27*/ "idxaddr", parm0 }, + { /* 28*/ "idxaddr.b", parm1 }, + { /* 29*/ "align.pri", parm1 }, + { /* 30*/ "align.alt", parm1 }, + { /* 31*/ "lctrl", parm1 }, + { /* 32*/ "sctrl", parm1 }, + { /* 33*/ "move.pri", parm0 }, + { /* 34*/ "move.alt", parm0 }, + { /* 35*/ "xchg", parm0 }, + { /* 36*/ "push.pri", parm0 }, + { /* 37*/ "push.alt", parm0 }, + { /* 38*/ "push.r", parm1 }, /* obsolete (never generated) */ + { /* 39*/ "push.c", parm1 }, + { /* 40*/ "push", parm1 }, + { /* 41*/ "push.s", parm1 }, + { /* 42*/ "pop.pri", parm0 }, + { /* 43*/ "pop.alt", parm0 }, + { /* 44*/ "stack", parm1 }, + { /* 45*/ "heap", parm1 }, + { /* 46*/ "proc", do_proc }, + { /* 47*/ "ret", parm0 }, + { /* 48*/ "retn", parm0 }, + { /* 49*/ "call", do_call }, + { /* 50*/ "call.pri", parm0 }, + { /* 51*/ "jump", do_jump }, + { /* 52*/ "jrel", parm1 }, /* same as jump, since version 10 */ + { /* 53*/ "jzer", do_jump }, + { /* 54*/ "jnz", do_jump }, + { /* 55*/ "jeq", do_jump }, + { /* 56*/ "jneq", do_jump }, + { /* 57*/ "jless", do_jump }, + { /* 58*/ "jleq", do_jump }, + { /* 59*/ "jgrtr", do_jump }, + { /* 60*/ "jgeq", do_jump }, + { /* 61*/ "jsless", do_jump }, + { /* 62*/ "jsleq", do_jump }, + { /* 63*/ "jsgrtr", do_jump }, + { /* 64*/ "jsgeq", do_jump }, + { /* 65*/ "shl", parm0 }, + { /* 66*/ "shr", parm0 }, + { /* 67*/ "sshr", parm0 }, + { /* 68*/ "shl.c.pri", parm1 }, + { /* 69*/ "shl.c.alt", parm1 }, + { /* 70*/ "shr.c.pri", parm1 }, + { /* 71*/ "shr.c.alt", parm1 }, + { /* 72*/ "smul", parm0 }, + { /* 73*/ "sdiv", parm0 }, + { /* 74*/ "sdiv.alt", parm0 }, + { /* 75*/ "umul", parm0 }, + { /* 76*/ "udiv", parm0 }, + { /* 77*/ "udiv.alt", parm0 }, + { /* 78*/ "add", parm0 }, + { /* 79*/ "sub", parm0 }, + { /* 80*/ "sub.alt", parm0 }, + { /* 81*/ "and", parm0 }, + { /* 82*/ "or", parm0 }, + { /* 83*/ "xor", parm0 }, + { /* 84*/ "not", parm0 }, + { /* 85*/ "neg", parm0 }, + { /* 86*/ "invert", parm0 }, + { /* 87*/ "add.c", parm1 }, + { /* 88*/ "smul.c", parm1 }, + { /* 89*/ "zero.pri", parm0 }, + { /* 90*/ "zero.alt", parm0 }, + { /* 91*/ "zero", parm1 }, + { /* 92*/ "zero.s", parm1 }, + { /* 93*/ "sign.pri", parm0 }, + { /* 94*/ "sign.alt", parm0 }, + { /* 95*/ "eq", parm0 }, + { /* 96*/ "neq", parm0 }, + { /* 97*/ "less", parm0 }, + { /* 98*/ "leq", parm0 }, + { /* 99*/ "grtr", parm0 }, + { /*100*/ "geq", parm0 }, + { /*101*/ "sless", parm0 }, + { /*102*/ "sleq", parm0 }, + { /*103*/ "sgrtr", parm0 }, + { /*104*/ "sgeq", parm0 }, + { /*105*/ "eq.c.pri", parm1 }, + { /*106*/ "eq.c.alt", parm1 }, + { /*107*/ "inc.pri", parm0 }, + { /*108*/ "inc.alt", parm0 }, + { /*109*/ "inc", parm1 }, + { /*110*/ "inc.s", parm1 }, + { /*111*/ "inc.i", parm0 }, + { /*112*/ "dec.pri", parm0 }, + { /*113*/ "dec.alt", parm0 }, + { /*114*/ "dec", parm1 }, + { /*115*/ "dec.s", parm1 }, + { /*116*/ "dec.i", parm0 }, + { /*117*/ "movs", parm1 }, + { /*118*/ "cmps", parm1 }, + { /*119*/ "fill", parm1 }, + { /*120*/ "halt", parm1 }, + { /*121*/ "bounds", parm1 }, + { /*122*/ "sysreq.pri", parm0 }, + { /*123*/ "sysreq.c", do_sysreq }, + { /*124*/ "file", do_file }, + { /*125*/ "line", parm2 }, + { /*126*/ "symbol", do_symbol }, + { /*127*/ "srange", parm2 }, /* version 1 */ + { /*128*/ "jump.pri", parm0 }, /* version 1 */ + { /*129*/ "switch", do_switch }, /* version 1 */ + { /*130*/ "casetbl", casetbl }, /* version 1 */ + { /*131*/ "swap.pri", parm0 }, /* version 4 */ + { /*132*/ "swap.alt", parm0 }, /* version 4 */ + { /*133*/ "push.adr", parm1 }, /* version 4 */ + { /*134*/ "nop", parm0 }, /* version 6 */ + { /*135*/ "sysreq.n", parm2 }, /* version 9 (replaces SYSREQ.d from earlier version) */ + { /*136*/ "symtag", parm1 }, /* version 7 */ + { /*137*/ "break", parm0 }, /* version 8 */ + { /*138*/ "push2.c", parm2 }, /* version 9 */ + { /*139*/ "push2", parm2 }, /* version 9 */ + { /*140*/ "push2.s", parm2 }, /* version 9 */ + { /*141*/ "push2.adr", parm2 }, /* version 9 */ + { /*142*/ "push3.c", parm3 }, /* version 9 */ + { /*143*/ "push3", parm3 }, /* version 9 */ + { /*144*/ "push3.s", parm3 }, /* version 9 */ + { /*145*/ "push3.adr", parm3 }, /* version 9 */ + { /*146*/ "push4.c", parm4 }, /* version 9 */ + { /*147*/ "push4", parm4 }, /* version 9 */ + { /*148*/ "push4.s", parm4 }, /* version 9 */ + { /*149*/ "push4.adr", parm4 }, /* version 9 */ + { /*150*/ "push5.c", parm5 }, /* version 9 */ + { /*151*/ "push5", parm5 }, /* version 9 */ + { /*152*/ "push5.s", parm5 }, /* version 9 */ + { /*153*/ "push5.adr", parm5 }, /* version 9 */ + { /*154*/ "load.both", parm2 }, /* version 9 */ + { /*155*/ "load.s.both",parm2 }, /* version 9 */ + { /*156*/ "const", parm2 }, /* version 9 */ + { /*157*/ "const.s", parm2 }, /* version 9 */ }; void print_opcode(FILE *ftxt,cell opcode,cell cip) From c9dc7008fa65d7d80273df92e0d8c6a3beab1585 Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Thu, 6 Jun 2019 23:14:22 +0700 Subject: [PATCH 2/5] pawndisasm: Fix input and output files not being closed properly and 'code' being leaked on errors --- source/compiler/pawndisasm.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index b261468..a3a7c89 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -456,19 +456,21 @@ static void addchars(char *str,cell value,int pos) int main(int argc,char *argv[]) { char name[FILENAME_MAX]; - FILE *fplist; + FILE *fplist=NULL; int codesize,count; - cell *code,*cip; + cell *code=NULL,*cip; OPCODE_PROC func; const char *filename; long nline,nprevline; FILE *fpsrc; int i,j; char line[sLINEMAX]; + int retval=1; + fpamx=NULL; if (argc<2 || argc>3) { printf("Usage: pawndisasm [output]\n"); - return 1; + goto ret; } /* if */ if (argc==2) { char *ptr; @@ -481,11 +483,11 @@ int main(int argc,char *argv[]) } /* if */ if ((fpamx=fopen(argv[1],"rb"))==NULL) { printf("Unable to open input file \"%s\"\n",argv[1]); - return 1; + goto ret; } /* if */ if ((fplist=fopen(name,"wt"))==NULL) { printf("Unable to create output file \"%s\"\n",name); - return 1; + goto ret; } /* if */ /* load debug info */ @@ -496,11 +498,11 @@ int main(int argc,char *argv[]) if (fread(&amxhdr,sizeof amxhdr,1,fpamx)==0) { printf("Unable to read AMX header: %s\n", feof(fpamx) ? "End of file reached" : strerror(errno)); - return 1; + goto ret; } /* if */ if (amxhdr.magic!=AMX_MAGIC) { printf("Not a valid AMX file\n"); - return 1; + goto ret; } /* if */ codesize=amxhdr.hea-amxhdr.cod; /* size for both code and data */ fprintf(fplist,";File version: %d\n",amxhdr.file_version); @@ -517,7 +519,7 @@ int main(int argc,char *argv[]) /* load the code block */ if ((code=malloc(codesize))==NULL) { printf("Insufficient memory: need %d bytes\n",codesize); - return 1; + goto ret; } /* if */ /* read and expand the file */ @@ -525,7 +527,7 @@ int main(int argc,char *argv[]) if ((int32_t)fread(code,1,codesize,fpamx) Date: Fri, 7 Jun 2019 19:54:40 +0700 Subject: [PATCH 3/5] pawndisasm: Remove function 'do_switch()' (a duplicate of 'do_jump()') --- source/compiler/pawndisasm.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index a3a7c89..bb50e83 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -47,8 +47,7 @@ cell do_proc(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_call(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_jump(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_sysreq(FILE *ftxt,const cell *params,cell opcode,cell cip); -cell do_switch(FILE *ftxt,const cell *params,cell opcode,cell cip); -cell casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip); +cell do_casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_file(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_symbol(FILE *ftxt,const cell *params,cell opcode,cell cip); @@ -188,8 +187,8 @@ static OPCODE opcodelist[] = { { /*126*/ "symbol", do_symbol }, { /*127*/ "srange", parm2 }, /* version 1 */ { /*128*/ "jump.pri", parm0 }, /* version 1 */ - { /*129*/ "switch", do_switch }, /* version 1 */ - { /*130*/ "casetbl", casetbl }, /* version 1 */ + { /*129*/ "switch", do_jump }, /* version 1 */ + { /*130*/ "casetbl", do_casetbl }, /* version 1 */ { /*131*/ "swap.pri", parm0 }, /* version 4 */ { /*132*/ "swap.alt", parm0 }, /* version 4 */ { /*133*/ "push.adr", parm1 }, /* version 4 */ @@ -353,14 +352,7 @@ cell do_sysreq(FILE *ftxt,const cell *params,cell opcode,cell cip) return 2; } -cell do_switch(FILE *ftxt,const cell *params,cell opcode,cell cip) -{ - print_opcode(ftxt,opcode,cip); - fprintf(ftxt," %08"PRIxC"\n",*params); - return 2; -} - -cell casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip) +cell do_casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip) { cell num; int idx; From cbc647d6bd73bb688c1aefaa564b27353678a17b Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Fri, 7 Jun 2019 23:36:07 +0700 Subject: [PATCH 4/5] pawndisasm: Properly handle invalid instructions --- source/compiler/pawndisasm.c | 38 +++++++++++++----------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index bb50e83..bf29088 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -48,8 +48,6 @@ cell do_call(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_jump(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_sysreq(FILE *ftxt,const cell *params,cell opcode,cell cip); cell do_casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip); -cell do_file(FILE *ftxt,const cell *params,cell opcode,cell cip); -cell do_symbol(FILE *ftxt,const cell *params,cell opcode,cell cip); typedef struct { @@ -58,7 +56,7 @@ typedef struct { } OPCODE; static OPCODE opcodelist[] = { - { /* 0*/ "???", parm0 }, + { /* 0*/ NULL, NULL }, { /* 1*/ "load.pri", parm1 }, { /* 2*/ "load.alt", parm1 }, { /* 3*/ "load.s.pri", parm1 }, @@ -182,10 +180,10 @@ static OPCODE opcodelist[] = { { /*121*/ "bounds", parm1 }, { /*122*/ "sysreq.pri", parm0 }, { /*123*/ "sysreq.c", do_sysreq }, - { /*124*/ "file", do_file }, - { /*125*/ "line", parm2 }, - { /*126*/ "symbol", do_symbol }, - { /*127*/ "srange", parm2 }, /* version 1 */ + { /*124*/ NULL, NULL }, /* file */ + { /*125*/ NULL, NULL }, /* line */ + { /*126*/ NULL, NULL }, /* symbol */ + { /*127*/ NULL, NULL }, /* srange, version 1 */ { /*128*/ "jump.pri", parm0 }, /* version 1 */ { /*129*/ "switch", do_jump }, /* version 1 */ { /*130*/ "casetbl", do_casetbl }, /* version 1 */ @@ -194,7 +192,7 @@ static OPCODE opcodelist[] = { { /*133*/ "push.adr", parm1 }, /* version 4 */ { /*134*/ "nop", parm0 }, /* version 6 */ { /*135*/ "sysreq.n", parm2 }, /* version 9 (replaces SYSREQ.d from earlier version) */ - { /*136*/ "symtag", parm1 }, /* version 7 */ + { /*136*/ NULL, NULL }, /* symtag, version 7 */ { /*137*/ "break", parm0 }, /* version 8 */ { /*138*/ "push2.c", parm2 }, /* version 9 */ { /*139*/ "push2", parm2 }, /* version 9 */ @@ -220,8 +218,7 @@ static OPCODE opcodelist[] = { void print_opcode(FILE *ftxt,cell opcode,cell cip) { - fprintf(ftxt,"%08"PRIxC" %s", - cip,opcodelist[(int)(opcode &0x0000ffff)].name); + fprintf(ftxt,"%08"PRIxC" %s",cip,opcodelist[opcode].name); } void print_funcname(FILE *ftxt,cell address) @@ -366,18 +363,6 @@ cell do_casetbl(FILE *ftxt,const cell *params,cell opcode,cell cip) return 2*num+1; } -cell do_file(FILE *ftxt,const cell *params,cell opcode,cell cip) -{ - assert(0); - return 0; -} - -cell do_symbol(FILE *ftxt,const cell *params,cell opcode,cell cip) -{ - assert(0); - return 0; -} - static void expand(unsigned char *code,long codesize,long memsize) { ucell c; @@ -558,8 +543,13 @@ int main(int argc,char *argv[]) nprevline=nline; } /* if */ } /* if */ - func=opcodelist[(int)(*cip&0x0000ffff)].func; - cip+=func(fplist,cip+1,*cip,(cell)(cip-code)*sizeof(cell)); + if (*(ucell *)cip>=(ucell)(sizeof opcodelist/sizeof opcodelist[0]) + || (func=opcodelist[*cip].func)==NULL) { + printf("Invalid opcode %08"PRIxC" at address %08"PRIxC"\n", + *cip, (cell)((unsigned char *)cip-(unsigned char *)code)); + goto ret; + } /* if */ + cip+=func(fplist,cip+1,*cip,(cell)((unsigned char *)cip-(unsigned char *)code)); } /* while */ /* dump the data section too */ From d965a406e41e39de5d7bf28a00ae498203be91b8 Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Fri, 7 Jun 2019 23:51:14 +0700 Subject: [PATCH 5/5] pawndisasm: Remove extra space after AMX flags --- source/compiler/pawndisasm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index bf29088..d339533 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -483,15 +483,15 @@ int main(int argc,char *argv[]) } /* if */ codesize=amxhdr.hea-amxhdr.cod; /* size for both code and data */ fprintf(fplist,";File version: %d\n",amxhdr.file_version); - fprintf(fplist,";Flags: "); + fprintf(fplist,";Flags: "); if ((amxhdr.flags & AMX_FLAG_COMPACT)!=0) - fprintf(fplist,"compact-encoding "); + fprintf(fplist," compact-encoding"); if ((amxhdr.flags & AMX_FLAG_DEBUG)!=0) - fprintf(fplist,"debug-info "); + fprintf(fplist," debug-info"); if ((amxhdr.flags & AMX_FLAG_NOCHECKS)!=0) - fprintf(fplist,"no-checks "); + fprintf(fplist," no-checks"); if ((amxhdr.flags & AMX_FLAG_SLEEP)!=0) - fprintf(fplist,"sleep "); + fprintf(fplist," sleep"); fprintf(fplist,"\n\n"); /* load the code block */ if ((code=malloc(codesize))==NULL) {