summaryrefslogtreecommitdiff
path: root/src/analysis/disass/rank.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/rank.c')
-rw-r--r--src/analysis/disass/rank.c12
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]);
/**