/src/capstonev5/suite/fuzz/fuzz_disasm.c
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // the following must precede stdio (woo, thanks msft) | 
| 2 |  | #if defined(_MSC_VER) && _MSC_VER < 1900 | 
| 3 |  | #define _CRT_SECURE_NO_WARNINGS | 
| 4 |  | #endif | 
| 5 |  |  | 
| 6 |  | #include <stdio.h> | 
| 7 |  | #include <stdlib.h> | 
| 8 |  | #include <inttypes.h> | 
| 9 |  |  | 
| 10 |  | #include <capstone/capstone.h> | 
| 11 |  |  | 
| 12 |  | #include "platform.h" | 
| 13 |  |  | 
| 14 |  | int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); | 
| 15 |  |  | 
| 16 |  |  | 
| 17 |  | static FILE *outfile = NULL; | 
| 18 |  |  | 
| 19 | 22.7k | int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { | 
| 20 | 22.7k |     csh handle; | 
| 21 | 22.7k |     cs_insn *all_insn; | 
| 22 | 22.7k |     cs_detail *detail; | 
| 23 | 22.7k |     cs_err err; | 
| 24 | 22.7k |     unsigned int i; | 
| 25 |  |  | 
| 26 | 22.7k |     if (Size < 1) { | 
| 27 |  |         // 1 byte for arch choice | 
| 28 | 0 |         return 0; | 
| 29 | 22.7k |     } else if (Size > 0x1000) { | 
| 30 |  |         //limit input to 4kb | 
| 31 | 0 |         Size = 0x1000; | 
| 32 | 0 |     } | 
| 33 |  |  | 
| 34 | 22.7k |     if (outfile == NULL) { | 
| 35 |  |         // we compute the output | 
| 36 | 1 |         outfile = fopen("/dev/null", "w"); | 
| 37 | 1 |         if (outfile == NULL) { | 
| 38 | 0 |             return 0; | 
| 39 | 0 |         } | 
| 40 | 1 |     } | 
| 41 |  |  | 
| 42 | 22.7k |     i = get_platform_entry((uint8_t)Data[0]); | 
| 43 |  |  | 
| 44 | 22.7k |     err = cs_open(platforms[i].arch, platforms[i].mode, &handle); | 
| 45 | 22.7k |     if (err) { | 
| 46 | 1 |         return 0; | 
| 47 | 1 |     } | 
| 48 |  |  | 
| 49 | 22.7k |     cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON); | 
| 50 | 22.7k |     if (Data[0]&0x80) { | 
| 51 |  |         //hack | 
| 52 | 6.09k |         cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT); | 
| 53 | 6.09k |     } | 
| 54 |  |  | 
| 55 | 22.7k |     uint64_t address = 0x1000; | 
| 56 | 22.7k |     size_t count = cs_disasm(handle, Data+1, Size-1, address, 0, &all_insn); | 
| 57 |  |  | 
| 58 | 22.7k |     if (count) { | 
| 59 | 22.4k |         size_t j; | 
| 60 | 22.4k |         unsigned int n; | 
| 61 |  |  | 
| 62 | 1.28M |         for (j = 0; j < count; j++) { | 
| 63 | 1.26M |             cs_insn *i = &(all_insn[j]); | 
| 64 | 1.26M |             fprintf(outfile, "0x%"PRIx64":\t%s\t\t%s // insn-ID: %u, insn-mnem: %s\n", | 
| 65 | 1.26M |                    i->address, i->mnemonic, i->op_str, | 
| 66 | 1.26M |                    i->id, cs_insn_name(handle, i->id)); | 
| 67 |  |  | 
| 68 | 1.26M |             detail = i->detail; | 
| 69 |  |  | 
| 70 | 1.26M |             if (detail->regs_read_count > 0) { | 
| 71 | 295k |                 fprintf(outfile, "\tImplicit registers read: "); | 
| 72 | 779k |                 for (n = 0; n < detail->regs_read_count; n++) { | 
| 73 | 483k |                     fprintf(outfile, "%s ", cs_reg_name(handle, detail->regs_read[n])); | 
| 74 | 483k |                 } | 
| 75 | 295k |             } | 
| 76 |  |  | 
| 77 | 1.26M |             if (detail->regs_write_count > 0) { | 
| 78 | 500k |                 fprintf(outfile, "\tImplicit registers modified: "); | 
| 79 | 1.12M |                 for (n = 0; n < detail->regs_write_count; n++) { | 
| 80 | 621k |                     fprintf(outfile, "%s ", cs_reg_name(handle, detail->regs_write[n])); | 
| 81 | 621k |                 } | 
| 82 | 500k |             } | 
| 83 |  |  | 
| 84 | 1.26M |             if (detail->groups_count > 0) { | 
| 85 | 639k |                 fprintf(outfile, "\tThis instruction belongs to groups: "); | 
| 86 | 1.64M |                 for (n = 0; n < detail->groups_count; n++) { | 
| 87 | 1.00M |                     fprintf(outfile, "%s ", cs_group_name(handle, detail->groups[n])); | 
| 88 | 1.00M |                 } | 
| 89 | 639k |             } | 
| 90 | 1.26M |         } | 
| 91 |  |  | 
| 92 | 22.4k |         fprintf(outfile, "0x%"PRIx64":\n", all_insn[j-1].address + all_insn[j-1].size); | 
| 93 | 22.4k |         cs_free(all_insn, count); | 
| 94 | 22.4k |     } | 
| 95 |  |  | 
| 96 | 22.7k |     cs_close(&handle); | 
| 97 |  |  | 
| 98 | 22.7k |     return 0; | 
| 99 | 22.7k | } |