Mercurial > repos > blastem
comparison debug.c @ 2186:935e684f2d58
Fix crash bug in expression parser
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 14 Aug 2022 09:55:06 -0700 |
parents | 3d2cc2af1da3 |
children | d0129f19ca52 |
comparison
equal
deleted
inserted
replaced
2185:3d2cc2af1da3 | 2186:935e684f2d58 |
---|---|
182 break; | 182 break; |
183 } | 183 } |
184 if (done) { | 184 if (done) { |
185 break; | 185 break; |
186 } | 186 } |
187 | 187 |
188 ++*end; | 188 ++*end; |
189 } | 189 } |
190 char *name = malloc(*end - start + 1); | 190 char *name = malloc(*end - start + 1); |
191 memcpy(name, start, *end - start); | 191 memcpy(name, start, *end - start); |
192 name[*end-start] = 0; | 192 name[*end-start] = 0; |
553 case '/': | 553 case '/': |
554 case '&': | 554 case '&': |
555 case '|': | 555 case '|': |
556 case '^': | 556 case '^': |
557 bin->right = parse_scalar(after_second, end); | 557 bin->right = parse_scalar(after_second, end); |
558 if (!bin->right) { | |
559 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op); | |
560 free_expr(bin); | |
561 return NULL; | |
562 } | |
558 return maybe_binary(bin, *end, end); | 563 return maybe_binary(bin, *end, end); |
559 case '+': | 564 case '+': |
560 case '-': | 565 case '-': |
561 bin->right = parse_scalar_or_muldiv(after_second, end); | 566 bin->right = parse_scalar_or_muldiv(after_second, end); |
567 if (!bin->right) { | |
568 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op); | |
569 free_expr(bin); | |
570 return NULL; | |
571 } | |
562 return maybe_binary(bin, *end, end); | 572 return maybe_binary(bin, *end, end); |
563 case '=': | 573 case '=': |
564 case '!': | 574 case '!': |
565 bin->right = parse_expression(after_second, end); | 575 bin->right = parse_expression(after_second, end); |
576 if (!bin->right) { | |
577 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op); | |
578 free_expr(bin); | |
579 return NULL; | |
580 } | |
566 return bin; | 581 return bin; |
567 default: | 582 default: |
568 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op); | 583 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op); |
569 free(bin->left); | 584 free(bin->left); |
570 free(bin); | 585 free(bin); |
944 out->args = args; | 959 out->args = args; |
945 out->num_args = num_args; | 960 out->num_args = num_args; |
946 } | 961 } |
947 out->def = def; | 962 out->def = def; |
948 out->format = format; | 963 out->format = format; |
949 | 964 |
950 ret = 1; | 965 ret = 1; |
951 cleanup_args: | 966 cleanup_args: |
952 if (!ret) { | 967 if (!ret) { |
953 for (int i = 0; i < num_args; i++) | 968 for (int i = 0; i < num_args; i++) |
954 { | 969 { |
1586 { | 1601 { |
1587 ++param; | 1602 ++param; |
1588 } | 1603 } |
1589 m68k_context *m68k = root->cpu_context; | 1604 m68k_context *m68k = root->cpu_context; |
1590 segacd_context *cd = m68k->system; | 1605 segacd_context *cd = m68k->system; |
1591 | 1606 |
1592 if (param && *param && !isspace(*param)) { | 1607 if (param && *param && !isspace(*param)) { |
1593 parsed_command cmd; | 1608 parsed_command cmd; |
1594 debug_root *main_root = find_m68k_root(cd->genesis->m68k); | 1609 debug_root *main_root = find_m68k_root(cd->genesis->m68k); |
1595 if (!main_root) { | 1610 if (!main_root) { |
1596 fputs("Failed to get debug root for Main CPU\n", stderr); | 1611 fputs("Failed to get debug root for Main CPU\n", stderr); |
1614 { | 1629 { |
1615 ++param; | 1630 ++param; |
1616 } | 1631 } |
1617 m68k_context *m68k = root->cpu_context; | 1632 m68k_context *m68k = root->cpu_context; |
1618 genesis_context *gen = m68k->system; | 1633 genesis_context *gen = m68k->system; |
1619 | 1634 |
1620 if (param && *param && !isspace(*param)) { | 1635 if (param && *param && !isspace(*param)) { |
1621 parsed_command cmd; | 1636 parsed_command cmd; |
1622 debug_root *z80_root = find_z80_root(gen->z80); | 1637 debug_root *z80_root = find_z80_root(gen->z80); |
1623 if (!z80_root) { | 1638 if (!z80_root) { |
1624 fputs("Failed to get debug root for Z80\n", stderr); | 1639 fputs("Failed to get debug root for Z80\n", stderr); |
2083 while (param && *param && isblank(*param)) | 2098 while (param && *param && isblank(*param)) |
2084 { | 2099 { |
2085 ++param; | 2100 ++param; |
2086 } | 2101 } |
2087 genesis_context *gen = (genesis_context *)current_system; | 2102 genesis_context *gen = (genesis_context *)current_system; |
2088 | 2103 |
2089 if (param && *param && !isspace(*param)) { | 2104 if (param && *param && !isspace(*param)) { |
2090 parsed_command cmd; | 2105 parsed_command cmd; |
2091 debug_root *m68k_root = find_m68k_root(gen->m68k); | 2106 debug_root *m68k_root = find_m68k_root(gen->m68k); |
2092 if (!m68k_root) { | 2107 if (!m68k_root) { |
2093 fputs("Failed to get debug root for M68K\n", stderr); | 2108 fputs("Failed to get debug root for M68K\n", stderr); |