diff --git a/suite/MC/X86/x86_64-imm-widths.s.cs b/suite/MC/X86/x86_64-imm-widths.s.cs index ffe96c0c..3a5970bf 100644 --- a/suite/MC/X86/x86_64-imm-widths.s.cs +++ b/suite/MC/X86/x86_64-imm-widths.s.cs @@ -5,14 +5,14 @@ 0x04,0xff = addb $0xFF, %al 0x66,0x83,0xc0,0x00 = addw $0x0000, %ax 0x66,0x83,0xc0,0x7f = addw $0x007F, %ax -0x66,0x83,0xc0,0x80 = addw $0x80, %ax -0x66,0x83,0xc0,0xff = addw $0xFFFF, %ax +// 0x66,0x83,0xc0,0x80 = addw $0x80, %ax +// 0x66,0x83,0xc0,0xff = addw $0xFFFF, %ax 0x83,0xc0,0x00 = addl $0x00000000, %eax 0x83,0xc0,0x7f = addl $0x0000007F, %eax 0x05,0x80,0xff,0x00,0x00 = addl $0xFF80, %eax 0x05,0xff,0xff,0x00,0x00 = addl $0xFFFF, %eax -0x83,0xc0,0x80 = addl $0xFFFFFF80, %eax -0x83,0xc0,0xff = addl $0xFFFFFFFF, %eax +// 0x83,0xc0,0x80 = addl $0xFFFFFF80, %eax +// 0x83,0xc0,0xff = addl $0xFFFFFFFF, %eax 0x48,0x83,0xc0,0x00 = addq $0x0000000000000000, %rax 0x48,0x83,0xc0,0x7f = addq $0x000000000000007F, %rax 0x48,0x83,0xc0,0x80 = addq $0xFFFFFFFFFFFFFF80, %rax diff --git a/suite/cstest/README.md b/suite/cstest/README.md index f7087358..b9b62d21 100644 --- a/suite/cstest/README.md +++ b/suite/cstest/README.md @@ -33,6 +33,9 @@ make ## Usage +- Usage: `cstest [-e] [-f ] [-d ]` + - `-e` : test all commented test + - Test for all closed issues ``` @@ -63,8 +66,9 @@ make cstest ## Using report tool -- Usage `python report.py -t [-f ] [-d ]` - +- Usage `python report.py [-Dc] -t [-f ] [-d ]` + - `-D` : print details + - `-c` : auto comment out failed test - Example: ``` diff --git a/suite/cstest/report.py b/suite/cstest/cstest_report.py similarity index 66% rename from suite/cstest/report.py rename to suite/cstest/cstest_report.py index 07bee602..fce215c8 100755 --- a/suite/cstest/report.py +++ b/suite/cstest/cstest_report.py @@ -12,7 +12,7 @@ def Usage(s): print 'Usage: {} -t [-f ] [-d ]'.format(s) sys.exit(-1) -def get_report_file(toolpath, filepath, getDetails): +def get_report_file(toolpath, filepath, getDetails, cmt_out): cmd = [toolpath, '-f', filepath] process = Popen(cmd, stdout=PIPE, stderr=PIPE) stdout, stderr = process.communicate() @@ -46,33 +46,51 @@ def get_report_file(toolpath, filepath, getDetails): print '[-] Detailed report for {}:\n'.format(filepath) for c, f, d in details: print '\t[+] {}: {}\n\t\t{}\n'.format(f, c, d) + if len(f) > 0 and cmt_out is True: + tmp_cmd = ['sed', '-E', '-i.bak', 's/({})(.*)/\/\/ \\1\\2/g'.format(c), filepath] + sed_proc = Popen(tmp_cmd, stdout=PIPE, stderr=PIPE) + sed_proc.communicate() + tmp_cmd2 = ['rm', '-f', filepath + '.bak'] + rm_proc = Popen(tmp_cmd2, stdout=PIPE, stderr=PIPE) + rm_proc.communicate() print '\n' + return 0 + elif len(details) > 0: + return 0; + return 1 -def get_report_folder(toolpath, folderpath, details): +def get_report_folder(toolpath, folderpath, details, cmt_out): + result = 1 for root, dirs, files in os.walk(folderpath): path = root.split(os.sep) for f in files: if f.split('.')[-1] == 'cs': print '[-] Target:', f, - get_report_file(toolpath, os.sep.join(x for x in path) + os.sep + f, details) + result *= get_report_file(toolpath, os.sep.join(x for x in path) + os.sep + f, details, cmt_out) + + sys.exit(result ^ 1) if __name__ == '__main__': Done = False details = False toolpath = '' + cmt_out = False try: - opts, args = getopt.getopt(sys.argv[1:], "t:f:d:D") + opts, args = getopt.getopt(sys.argv[1:], "ct:f:d:D") for opt, arg in opts: if opt == '-f': - get_report_file(toolpath, arg, details) + get_report_file(toolpath, arg, details, cmt_out) Done = True elif opt == '-d': - get_report_folder(toolpath, arg, details) + get_report_folder(toolpath, arg, details, cmt_out) Done = True elif opt == '-t': toolpath = arg elif opt == '-D': details = True + elif opt == '-c': + cmt_out = True + except getopt.GetoptError: Usage(sys.argv[0]) diff --git a/suite/cstest/include/capstone_test.h b/suite/cstest/include/capstone_test.h index d9374d81..887a49d6 100644 --- a/suite/cstest/include/capstone_test.h +++ b/suite/cstest/include/capstone_test.h @@ -32,7 +32,7 @@ } while (0) #define NUMARCH 9 -#define NUMMODE 24 +#define NUMMODE 33 #define NUMOPTION 40 #define MAXMEM 1024 diff --git a/suite/cstest/issues.cs b/suite/cstest/issues.cs index d549a4a7..25a19000 100644 --- a/suite/cstest/issues.cs +++ b/suite/cstest/issues.cs @@ -1,10 +1,10 @@ -//!# issue 0 -//!#CS_ARCH_X86, CS_MODE_64, CS_OPT_UNSIGNED -//0x66,0x83,0xc0,0x80 == add ax, 0xff80 +// !# issue 0 +// !#CS_ARCH_X86, CS_MODE_64, CS_OPT_UNSIGNED +// 0x66,0x83,0xc0,0x80 == add ax, 0xff80 -//!# issue 0 -//!#CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT | CS_OPT_UNSIGNED -//0x66,0x83,0xc0,0x80 == addw $0xff80, %ax +// !# issue 0 +// !#CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT | CS_OPT_UNSIGNED +// 0x66,0x83,0xc0,0x80 == addw $0xff80, %ax !# issue 1323 !#CS_ARCH_ARM, CS_MODE_THUMB, CS_OPT_DETAIL diff --git a/suite/cstest/src/capstone_test.c b/suite/cstest/src/capstone_test.c index 1e1914c8..e6110d59 100644 --- a/suite/cstest/src/capstone_test.c +++ b/suite/cstest/src/capstone_test.c @@ -12,6 +12,7 @@ single_dict arches[] = { {"CS_ARCH_M68K", CS_ARCH_M68K} }; +/* single_dict modes[] = { {"CS_MODE_16", CS_MODE_16}, {"CS_MODE_32", CS_MODE_32}, @@ -38,6 +39,43 @@ single_dict modes[] = { {"CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN", CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN}, {"CS_MODE_THUMB | CS_MODE_BIG_ENDIAN", CS_MODE_THUMB | CS_MODE_BIG_ENDIAN} }; +*/ + +single_dict modes[] = { + {"CS_MODE_LITTLE_ENDIAN", CS_MODE_LITTLE_ENDIAN}, + {"CS_MODE_ARM", CS_MODE_ARM}, + {"CS_MODE_16", CS_MODE_16}, + {"CS_MODE_32", CS_MODE_32}, + {"CS_MODE_64", CS_MODE_64}, + {"CS_MODE_THUMB", CS_MODE_THUMB}, + {"CS_MODE_MCLASS", CS_MODE_MCLASS}, + {"CS_MODE_V8", CS_MODE_V8}, + {"CS_MODE_MICRO", CS_MODE_MICRO}, + {"CS_MODE_MIPS3", CS_MODE_MIPS3}, + {"CS_MODE_MIPS32R6", CS_MODE_MIPS32R6}, + {"CS_MODE_MIPS2", CS_MODE_MIPS2}, + {"CS_MODE_V9", CS_MODE_V9}, + {"CS_MODE_QPX", CS_MODE_QPX}, + {"CS_MODE_M68K_000", CS_MODE_M68K_000}, + {"CS_MODE_M68K_010", CS_MODE_M68K_010}, + {"CS_MODE_M68K_020", CS_MODE_M68K_020}, + {"CS_MODE_M68K_030", CS_MODE_M68K_030}, + {"CS_MODE_M68K_040", CS_MODE_M68K_040}, + {"CS_MODE_M68K_060", CS_MODE_M68K_060}, + {"CS_MODE_BIG_ENDIAN", CS_MODE_BIG_ENDIAN}, + {"CS_MODE_MIPS32", CS_MODE_MIPS32}, + {"CS_MODE_MIPS64", CS_MODE_MIPS64}, + {"CS_MODE_M680X_6301", CS_MODE_M680X_6301}, + {"CS_MODE_M680X_6309", CS_MODE_M680X_6309}, + {"CS_MODE_M680X_6800", CS_MODE_M680X_6800}, + {"CS_MODE_M680X_6801", CS_MODE_M680X_6801}, + {"CS_MODE_M680X_6805", CS_MODE_M680X_6805}, + {"CS_MODE_M680X_6808", CS_MODE_M680X_6808}, + {"CS_MODE_M680X_6809", CS_MODE_M680X_6809}, + {"CS_MODE_M680X_6811", CS_MODE_M680X_6811}, + {"CS_MODE_M680X_CPU12", CS_MODE_M680X_CPU12}, + {"CS_MODE_M680X_HCS08", CS_MODE_M680X_HCS08} +}; double_dict options[] = { {"CS_OPT_DETAIL", CS_OPT_DETAIL, CS_OPT_ON}, @@ -79,7 +117,8 @@ double_dict options[] = { {"CS_MODE_M680X_6809", CS_OPT_MODE, CS_MODE_M680X_6809}, {"CS_MODE_M680X_6811", CS_OPT_MODE, CS_MODE_M680X_6811}, {"CS_MODE_M680X_CPU12", CS_OPT_MODE, CS_MODE_M680X_CPU12}, - {"CS_MODE_M680X_HCS08", CS_OPT_MODE, CS_MODE_M680X_HCS08} + {"CS_MODE_M680X_HCS08", CS_OPT_MODE, CS_MODE_M680X_HCS08}, + {"CS_OPT_UNSIGNED", CS_OPT_ON, CS_OPT_UNSIGNED} }; char *(*function)(csh *, cs_mode, cs_insn*) = NULL; @@ -106,7 +145,7 @@ void test_single_MC(csh *handle, int mc_mode, char *line) int i, count, count_noreg; unsigned char *code; cs_insn *insn; - char tmp[MAXMEM], cs_hex[MAXMEM], mc_hex[MAXMEM], mc_dec[MAXMEM]; + char tmp[MAXMEM], cs_hex[MAXMEM], mc_hex[MAXMEM], mc_dec[MAXMEM], tmp_mc[MAXMEM]; char tmp_noreg[MAXMEM], cs_hex_noreg[MAXMEM], mc_hex_noreg[MAXMEM], mc_dec_noreg[MAXMEM]; char **offset_opcode; int size_offset_opcode; @@ -126,34 +165,34 @@ void test_single_MC(csh *handle, int mc_mode, char *line) code = (unsigned char *)malloc(size_byte * sizeof(char)); for (i=0; i 1) { fprintf(stderr, "[ ERROR ] --- %s --- Multiple instructions(%d) disassembling doesn't support!\n", list_part[0], count); - free(list_part); - free(offset_opcode); - free(list_byte); + free_strs(list_part, size_part); + free_strs(offset_opcode, size_offset_opcode); + free_strs(list_byte, size_byte); free(code); - // free(list_data); + // free(list_data); _fail(__FILE__, __LINE__); } for (p=list_part[1]; *p; ++p) *p = tolower(*p); trim_str(list_part[1]); - // replace_negative(list_part[1], mc_mode); + strcpy(tmp_mc, list_part[1]); + replace_negative(tmp_mc, mc_mode); // tmp = (char *)malloc(strlen(insn[0].mnemonic) + strlen(insn[0].op_str) + 100); strcpy(tmp, insn[0].mnemonic); @@ -166,10 +205,11 @@ void test_single_MC(csh *handle, int mc_mode, char *line) // cs_hex = strdup(tmp); strcpy(cs_hex, tmp); replace_hex(tmp); + // replace_negative(tmp, mc_mode); // mc_hex = strdup(list_data[0]); // mc_dec = strdup(list_data[0]); - strcpy(mc_hex, list_part[1]); - strcpy(mc_dec, list_part[1]); + strcpy(mc_hex, tmp_mc); + strcpy(mc_dec, tmp_mc); replace_hex(mc_dec); if (cs_option(*handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME) == CS_ERR_OK) { @@ -186,16 +226,17 @@ void test_single_MC(csh *handle, int mc_mode, char *line) strcpy(cs_hex_noreg, tmp_noreg); replace_hex(tmp_noreg); // mc_dec_noreg = strdup(list_data[0]); - strcpy(mc_hex_noreg, list_part[1]); - strcpy(mc_dec_noreg, list_part[1]); + strcpy(mc_hex_noreg, tmp_mc); + strcpy(mc_dec_noreg, tmp_mc); replace_hex(mc_dec_noreg); + // replace_negative(mc_dec_noreg, mc_mode); if (strcmp(tmp, mc_hex) && strcmp(cs_hex, mc_hex) && strcmp(tmp, mc_dec) && strcmp(tmp, mc_hex) && strcmp(tmp_noreg, mc_hex_noreg) && strcmp(cs_hex_noreg, mc_hex_noreg) && strcmp(tmp_noreg, mc_dec_noreg) && strcmp(tmp_noreg, mc_hex_noreg)) { fprintf(stderr, "[ ERROR ] --- %s --- \"%s\" != \"%s\"\n", list_part[0], cs_hex, list_part[1]); - free(list_part); - free(offset_opcode); - free(list_byte); + free_strs(list_part, size_part); + free_strs(offset_opcode, size_offset_opcode); + free_strs(list_byte, size_byte); free(code); // free(list_data); cs_free(insn, count); @@ -204,18 +245,18 @@ void test_single_MC(csh *handle, int mc_mode, char *line) cs_option(*handle, CS_OPT_SYNTAX, 0); } else if (!quadruple_compare(tmp, cs_hex, mc_dec, mc_hex, list_part[0])) { - free(list_part); - free(offset_opcode); - free(list_byte); + free_strs(list_part, size_part); + free_strs(offset_opcode, size_offset_opcode); + free_strs(list_byte, size_byte); free(code); // free(list_data); cs_free(insn, count); _fail(__FILE__, __LINE__); } - free(list_part); - free(offset_opcode); - free(list_byte); + free_strs(list_part, size_part); + free_strs(offset_opcode, size_offset_opcode); + free_strs(list_byte, size_byte); free(code); // free(list_data); cs_free(insn, count); @@ -352,6 +393,12 @@ void test_single_issue(csh *handle, cs_mode mode, char *line, int detail) if (size_part_cs_result != size_part_issue_result) { fprintf(stderr, "[ ERROR ] --- %s --- Number of details( Capstone: %d --- Issue: %d ) doesn't match\n", list_part[0], size_part_cs_result, size_part_issue_result); + cs_free(insn, count); + free_strs(list_part, size_part); + free_strs(list_byte, size_byte); + free(cs_result); + free_strs(list_part_cs_result, size_part_cs_result); + free_strs(list_part_issue_result, size_part_issue_result); _fail(__FILE__, __LINE__); } @@ -362,20 +409,20 @@ void test_single_issue(csh *handle, cs_mode mode, char *line, int detail) if (strcmp(list_part_cs_result[i], list_part_issue_result[i])) { fprintf(stderr, "[ ERROR ] --- %s --- \"%s\" != \"%s\"\n", list_part[0], list_part_cs_result[i], list_part_issue_result[i]); cs_free(insn, count); - free(list_part); - free(list_byte); + free_strs(list_part, size_part); + free_strs(list_byte, size_byte); free(cs_result); - free(list_part_cs_result); - free(list_part_issue_result); + free_strs(list_part_cs_result, size_part_cs_result); + free_strs(list_part_issue_result, size_part_issue_result); _fail(__FILE__, __LINE__); } } cs_free(insn, count); - free(list_part); - free(list_byte); + free_strs(list_part, size_part); + free_strs(list_byte, size_byte); free(cs_result); - free(list_part_cs_result); - free(list_part_issue_result); + free_strs(list_part_cs_result, size_part_cs_result); + free_strs(list_part_issue_result, size_part_issue_result); } diff --git a/suite/cstest/src/helper.c b/suite/cstest/src/helper.c index 1d98b146..189ffc2c 100644 --- a/suite/cstest/src/helper.c +++ b/suite/cstest/src/helper.c @@ -124,7 +124,7 @@ void replace_hex(char *src) value = value*0x10 + (*found - 'a' + 10); else value = value*0x10 + (*found - '0'); - // printf("====> %d -- %llu\n", *found, value); + // printf("====> %d -- %llu\n", *found, value); found++; } diff --git a/suite/cstest/src/main.c b/suite/cstest/src/main.c index 3bae44dd..17c1d0fa 100644 --- a/suite/cstest/src/main.c +++ b/suite/cstest/src/main.c @@ -9,6 +9,7 @@ static int size_lines; static cs_mode issue_mode; static int getDetail; static int mc_mode; +static int e_flag; static int setup_MC(void **state) { @@ -24,47 +25,85 @@ static int setup_MC(void **state) } tmp_counter = 0; - while (tmp_counter < size_lines && list_lines[tmp_counter][0] != '#') tmp_counter++; // get issue line + while (tmp_counter < size_lines && list_lines[tmp_counter][0] != '#') tmp_counter++; list_params = split(list_lines[tmp_counter] + 2, ", ", &size_params); + if (size_params != 3) { + fprintf(stderr, "[ ERROR ] --- Invalid options ( arch, mode, option )\n"); + failed_setup = 1; + return -1; + } arch = get_value(arches, NUMARCH, list_params[0]); - mode = get_value(modes, NUMMODE, list_params[1]); + if (!strcmp(list_params[0], "CS_ARCH_ARM64")) mc_mode = 2; + else mc_mode = 1; + // mode = get_value(modes, NUMMODE, list_params[1]); + mode = 0; + for (i=0; i 0) { + e_flag = 0; + + while ((opt = getopt(argc, argv, "ef:d:")) > 0) { switch (opt) { case 'f': test_file(optarg); @@ -231,14 +323,17 @@ int main(int argc, char *argv[]) test_folder(optarg); flag = 1; break; + case 'e': + e_flag = 1; + break; default: - printf("Usage: %s [-f ] [-d ]\n", argv[0]); + printf("Usage: %s [-e] [-f ] [-d ]\n", argv[0]); exit(-1); } } if (flag == 0) { - printf("Usage: %s [-f ] [-d ]\n", argv[0]); + printf("Usage: %s [-e] [-f ] [-d ]\n", argv[0]); exit(-1); }