diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/analysis/disass/loop.c | 16 | ||||
| -rw-r--r-- | src/gtkext/gtklinkrenderer.c | 3 | 
2 files changed, 17 insertions, 2 deletions
| diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c index 301f084..6fd73f2 100644 --- a/src/analysis/disass/loop.c +++ b/src/analysis/disass/loop.c @@ -196,6 +196,7 @@ static void add_step_into_exec_flow(exec_flow *flow, vmpa_t addr)  static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end, exec_flow *flow)  { +    bool exit_track;                        /* Détermine la fin du parcours*/      GArchInstruction *iter;                 /* Boucle de parcours          */      GArchInstruction **dests;               /* Instr. visée par une autre  */      InstructionLinkType *types;             /* Type de lien entre lignes   */ @@ -206,16 +207,23 @@ static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end      add_step_into_exec_flow(flow, start); +    exit_track = false; +      for (iter = g_arch_instruction_find_by_address(list, start, true); -         iter != NULL; +         iter != NULL && !exit_track;           iter = g_arch_instruction_get_next_iter(list, iter, end))      {          dcount = g_arch_instruction_get_destinations(iter, &dests, &types, NULL); +        if (dcount == 0) continue;          for (i = 0; i < dcount; i++)              switch (types[i])              {                  case ILT_LOOP: +                    /** +                     * On est déjà passé par là, donc on peut arrêter le parcours courant. +                     */ +                    exit_track = true;                      break;                  case ILT_CALL: @@ -223,6 +231,12 @@ static void track_loops_in_code(GArchInstruction *list, vmpa_t start, vmpa_t end                      break;                  default: +                    /** +                     * On se lance dans d'autres suivis qui vont parcourir le reste des +                     * instructions, donc on peut arrêter le parcours courant ici. +                     */ +                    exit_track = true; +                      g_arch_instruction_get_location(dests[i], NULL, NULL, &addr);                      if (!is_new_exec_flow(flow, addr)) diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c index 1d4a86d..7ef1c37 100644 --- a/src/gtkext/gtklinkrenderer.c +++ b/src/gtkext/gtklinkrenderer.c @@ -240,8 +240,9 @@ void _gtk_link_renderer_draw(const GtkLinkRenderer *renderer, cairo_t *cairo, bo      /**       * Si on ne veut pas de flèche, on doit se destiner à un aperçu...       * Dans ce cas, pour plus de lisibilité, on double la taille d'impression. +     * Et pour faire ressortir les boucles, on double encore les liens associés.       */ -    cairo_set_line_width(cairo, arrow ? 1 : 2); +    cairo_set_line_width(cairo, arrow ? 1 : (renderer->color == LKC_BLUE ? 4 : 2));      cairo_move_to(cairo, renderer->points[0].x + 0.5, renderer->points[0].y); | 
