diff options
Diffstat (limited to 'src/analysis/disass/rank.c')
-rw-r--r-- | src/analysis/disass/rank.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c index 0b9068b..7504231 100644 --- a/src/analysis/disass/rank.c +++ b/src/analysis/disass/rank.c @@ -324,6 +324,18 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) /* La boucle de remontée n'abaisse pas les rangs */ if (types[i] == ILT_LOOP) continue; + /** + * On se doit de suivre le même cheminement que celui emprunté lors + * du parcours de create_dragon_nodes(). + * Sinon, les chemins divergent et une récursion infinie peut survenir. + */ + if (types[i] != ILT_EXEC_FLOW + && types[i] != ILT_JUMP + && types[i] != ILT_CASE_JUMP + && types[i] != ILT_JUMP_IF_TRUE + && types[i] != ILT_JUMP_IF_FALSE) + continue; + target = g_block_list_find_by_starting_instr(list, dests[i]); /** |