More false positive fixes

This commit is contained in:
Lior Halphon 2017-02-25 16:06:38 +02:00
parent dbd04f09e8
commit 2c1d2571d3

View File

@ -20,7 +20,8 @@ static char *bmp_filename;
static char *log_filename; static char *log_filename;
static FILE *log_file; static FILE *log_file;
static void replace_extension(const char *src, size_t length, char *dest, const char *ext); static void replace_extension(const char *src, size_t length, char *dest, const char *ext);
static bool push_start_a, start_is_not_first, a_is_bad, b_is_confirm, push_faster, push_slower, do_not_stop, push_a_twice, start_is_bad, allow_weird_sp_values; static bool push_start_a, start_is_not_first, a_is_bad, b_is_confirm, push_faster, push_slower,
do_not_stop, push_a_twice, start_is_bad, allow_weird_sp_values, large_stack, push_right;
static unsigned int test_length = 60 * 40; static unsigned int test_length = 60 * 40;
GB_gameboy_t gb; GB_gameboy_t gb;
@ -59,10 +60,10 @@ static void vblank(GB_gameboy_t *gb)
push_a_twice? frames / 4: push_a_twice? frames / 4:
frames) % combo_length + (start_is_bad? 20 : 0) ) { frames) % combo_length + (start_is_bad? 20 : 0) ) {
case 0: case 0:
gb->keys[7] = true; // Start down gb->keys[push_right? 0 : 7] = true; // Start (Or right) down
break; break;
case 10: case 10:
gb->keys[7] = false; // Start up gb->keys[push_right? 0 : 7] = false; // Start (Or right) up
break; break;
case 20: case 20:
gb->keys[b_is_confirm? 5: 4] = true; // A down (or B) gb->keys[b_is_confirm? 5: 4] = true; // A down (or B)
@ -87,7 +88,7 @@ static void vblank(GB_gameboy_t *gb)
/* Detect common crashes and stop the test early */ /* Detect common crashes and stop the test early */
if (frames < test_length - 1) { if (frames < test_length - 1) {
if (gb->backtrace_size >= 0x200 || (!allow_weird_sp_values && (gb->registers[GB_REGISTER_SP] >= 0xfe00 && gb->registers[GB_REGISTER_SP] < 0xff80))) { if (gb->backtrace_size >= 0x200 + (large_stack? 0x80: 0) || (!allow_weird_sp_values && (gb->registers[GB_REGISTER_SP] >= 0xfe00 && gb->registers[GB_REGISTER_SP] < 0xff80))) {
GB_log(gb, "A stack overflow has probably occurred. (SP = $%04x; backtrace size = %d) \n", GB_log(gb, "A stack overflow has probably occurred. (SP = $%04x; backtrace size = %d) \n",
gb->registers[GB_REGISTER_SP], gb->backtrace_size); gb->registers[GB_REGISTER_SP], gb->backtrace_size);
frames = test_length - 1; frames = test_length - 1;
@ -322,10 +323,15 @@ int main(int argc, char **argv)
push_faster = strcmp((const char *)(gb.rom + 0x134), "MOGURA DE PON!") == 0; push_faster = strcmp((const char *)(gb.rom + 0x134), "MOGURA DE PON!") == 0;
push_slower = strcmp((const char *)(gb.rom + 0x134), "BAKENOU") == 0; push_slower = strcmp((const char *)(gb.rom + 0x134), "BAKENOU") == 0;
do_not_stop = strcmp((const char *)(gb.rom + 0x134), "SPACE INVADERS") == 0; do_not_stop = strcmp((const char *)(gb.rom + 0x134), "SPACE INVADERS") == 0;
push_right = memcmp((const char *)(gb.rom + 0x134), "BOB ET BOB", strlen("BOB ET BOB")) == 0;
/* This game temporarily sets SP to OAM RAM */ /* This game temporarily sets SP to OAM RAM */
allow_weird_sp_values = strcmp((const char *)(gb.rom + 0x134), "WDL:TT") == 0; allow_weird_sp_values = strcmp((const char *)(gb.rom + 0x134), "WDL:TT") == 0;
/* This game uses some recursive algorithms and therefore requires quite a large call stack */
large_stack = memcmp((const char *)(gb.rom + 0x134), "MICRO EPAK1BM", strlen("MICRO EPAK1BM")) == 0;
/* Pressing start while in the map in Tsuri Sensi will leak an internal screen-stack which /* Pressing start while in the map in Tsuri Sensi will leak an internal screen-stack which
will eventually overflow, override an array of jump-table indexes, jump to a random will eventually overflow, override an array of jump-table indexes, jump to a random
address, execute an invalid opcode, and crash. Pressing A twice while slowing down address, execute an invalid opcode, and crash. Pressing A twice while slowing down