diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/links.c | 150 |
1 files changed, 75 insertions, 75 deletions
diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index 43b7e6f..8d826c5 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -30,13 +30,86 @@ +/* Rétablit un lien naturel coupé par un autre lien. */ +static void establish_natural_link(GArchInstruction *, GArchInstruction *); + /* Complète un désassemblage accompli pour une instruction. */ static void convert_immediate_into_target(GArchInstruction *, size_t, GBinFormat *); -/* Rétablit un lien naturel coupé par un autre lien. */ -static void establish_natural_link(GArchInstruction *, GArchInstruction *); +/****************************************************************************** +* * +* Paramètres : instr = instruction désassemblée à traiter. * +* prev = instruction précédente. * +* * +* Description : Rétablit un lien naturel coupé par un autre lien. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) +{ + GArchInstruction **others; /* Instructions diverses liées */ + InstructionLinkType *types; /* Types de lien existants */ + size_t count; /* Nbre de sources affichées */ + size_t i; /* Boucle de parcours */ + + /** + * Si rien ne vient séparer les deux instructions, + * on ne peut pas créer de lien plus naturel que l'existant. + */ + + if (!g_arch_instruction_has_sources(instr)) + return; + + /** + * Si on se trouve à une extrémité, on ne se lie pas + * avec le voisin. + */ + + if (g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT) + return; + + if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START) + return; + + /** + * On s'assure que le lien naturel est valide. + */ + + count = g_arch_instruction_get_destinations(prev, &others, &types, NULL); + + for (i = 0; i < count; i++) + { + if (types[i] == ILT_EXEC_FLOW) break; + if (types[i] == ILT_JUMP) break; + if (types[i] == ILT_CASE_JUMP) break; + if (types[i] == ILT_LOOP) break; + } + + if (count > 0 && i < count) return; + + /** + * On vérifie que le lien n'existe pas déjà avant d'en créer un... + */ + + count = g_arch_instruction_get_sources(instr, &others, &types); + + for (i = 0; i < count; i++) + { + if (others[i] == prev && types[i] == ILT_JUMP_IF_TRUE) break; + if (others[i] == prev && types[i] == ILT_JUMP_IF_FALSE) break; + } + + if (i == count) + g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW); + +} + /****************************************************************************** * * @@ -125,79 +198,6 @@ static void establish_links_for_instruction(GArchInstruction *instr, GArchInstru /****************************************************************************** * * -* Paramètres : instr = instruction désassemblée à traiter. * -* prev = instruction précédente. * -* * -* Description : Rétablit un lien naturel coupé par un autre lien. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) -{ - GArchInstruction **others; /* Instructions diverses liées */ - InstructionLinkType *types; /* Types de lien existants */ - size_t count; /* Nbre de sources affichées */ - size_t i; /* Boucle de parcours */ - - /** - * Si rien ne vient séparer les deux instructions, - * on ne peut pas créer de lien plus naturel que l'existant. - */ - - if (!g_arch_instruction_has_sources(instr)) - return; - - /** - * Si on se trouve à une extrémité, on ne se lie pas - * avec le voisin. - */ - - if (g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT) - return; - - if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START) - return; - - /** - * On s'assure que le lien naturel est valide. - */ - - count = g_arch_instruction_get_destinations(prev, &others, &types, NULL); - - for (i = 0; i < count; i++) - { - if (types[i] == ILT_EXEC_FLOW) break; - if (types[i] == ILT_JUMP) break; - if (types[i] == ILT_CASE_JUMP) break; - if (types[i] == ILT_LOOP) break; - } - - if (count > 0 && i < count) return; - - /** - * On vérifie que le lien n'existe pas déjà avant d'en créer un... - */ - - count = g_arch_instruction_get_sources(instr, &others, &types); - - for (i = 0; i < count; i++) - { - if (others[i] == prev && types[i] == ILT_JUMP_IF_TRUE) break; - if (others[i] == prev && types[i] == ILT_JUMP_IF_FALSE) break; - } - - if (i == count) - g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW); - -} - - -/****************************************************************************** -* * * Paramètres : list = ensemble d'instructions à relier. * * format = accès aux données du binaire d'origine. * * statusbar = barre de statut avec progression à mettre à jour.* |