diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/db/items/comment.c | 4 | ||||
-rw-r--r-- | src/analysis/decomp/il.c | 4 | ||||
-rw-r--r-- | src/analysis/disass/dragon.c | 20 | ||||
-rw-r--r-- | src/analysis/disass/links.c | 8 | ||||
-rw-r--r-- | src/analysis/disass/loop.c | 4 | ||||
-rw-r--r-- | src/analysis/disass/rank.c | 14 | ||||
-rw-r--r-- | src/analysis/routine.c | 18 |
7 files changed, 51 insertions, 21 deletions
diff --git a/src/analysis/db/items/comment.c b/src/analysis/db/items/comment.c index 9fc2767..8155fc5 100644 --- a/src/analysis/db/items/comment.c +++ b/src/analysis/db/items/comment.c @@ -634,7 +634,7 @@ static bool g_db_comment_run(GDbComment *comment, GLoadedBinary *binary, bool ap GArchInstruction *instr; /* Instruction à traiter */ size_t scount; /* Nbre de sources affichées */ size_t i; /* Boucle de parcours */ - instr_link_t *source; /* Instruction diverse liée */ + const instr_link_t *source; /* Instruction diverse liée */ const mrange_t *range; /* Emplacement d'instruction */ size_t linked; /* Indice lié à traiter */ @@ -720,6 +720,8 @@ static bool g_db_comment_run(GDbComment *comment, GLoadedBinary *binary, bool ap RUN_INLINED_COMMENT(linked, comment, comment->old_inlined[i]); + unref_instr_link(source); + } if (!apply) diff --git a/src/analysis/decomp/il.c b/src/analysis/decomp/il.c index 5827c4b..cbc0c37 100644 --- a/src/analysis/decomp/il.c +++ b/src/analysis/decomp/il.c @@ -618,7 +618,7 @@ static void close_case_decomp_instructions(GDecInstruction *case_dinstr, GInstrB GArchInstruction *last; /* Dernière instruction de bloc*/ size_t dcount; /* Nombre de liens de dest. */ size_t j; /* Boucle de parcours #2 */ - instr_link_t *dest; /* Instr. visée par une autre */ + const instr_link_t *dest; /* Instr. visée par une autre */ vmpa_t addr; /* Adresse d'une instruction */ bool jump_to_case; /* Suite dans le cas suivant ? */ @@ -659,6 +659,8 @@ static void close_case_decomp_instructions(GDecInstruction *case_dinstr, GInstrB else is_common = (common_addr == addr); + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(last); diff --git a/src/analysis/disass/dragon.c b/src/analysis/disass/dragon.c index 44d82da..04f5190 100644 --- a/src/analysis/disass/dragon.c +++ b/src/analysis/disass/dragon.c @@ -104,10 +104,10 @@ static dragon_node *create_dragon_nodes(GArchProcessor *proc, const instr_covera size_t scount; /* Nombre de liens de source */ bool cut; /* Un découpage a été réalisé ?*/ size_t i; /* Boucle de parcours */ - instr_link_t *source; /* Instruction de source liée */ + const instr_link_t *source; /* Instruction de source liée */ dragon_node *new; /* Nouvel élément à créer */ size_t dcount; /* Nombre de liens de dest. */ - instr_link_t *dest; /* Instruction de destination */ + const instr_link_t *dest; /* Instruction de destination */ result = NULL; *count = 0; @@ -204,6 +204,8 @@ static dragon_node *create_dragon_nodes(GArchProcessor *proc, const instr_covera } + unref_instr_link(source); + } g_arch_instruction_unlock_src(instr); @@ -238,6 +240,8 @@ static dragon_node *create_dragon_nodes(GArchProcessor *proc, const instr_covera } + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(instr); @@ -448,7 +452,7 @@ void compute_all_paths(dragon_node *nodes, size_t count) { size_t dcount; /* Nombre de liens de dest. */ size_t i; /* Boucle de parcours */ - instr_link_t *dest; /* Instructions de destination */ + const instr_link_t *dest; /* Instructions de destination */ dragon_node *next; /* Noeud suivant dans le code */ size_t id; /* Indice du bit associé */ @@ -483,6 +487,8 @@ void compute_all_paths(dragon_node *nodes, size_t count) } + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(node->last); @@ -535,7 +541,7 @@ void compute_all_dominators(dragon_node *nodes, size_t count) dragon_node *predecessor; /* Noeud prédécesseur direct */ size_t scount; /* Nombre de liens de source */ size_t i; /* Boucle de parcours #2 */ - instr_link_t *source; /* Instruction d'origine */ + const instr_link_t *source; /* Instruction d'origine */ inter = create_bit_field(count, false); @@ -575,9 +581,9 @@ void compute_all_dominators(dragon_node *nodes, size_t count) */ - if (predecessor == NULL) break; + if (predecessor != NULL) + and_bit_field(inter, predecessor->bits); - and_bit_field(inter, predecessor->bits); break; default: @@ -585,6 +591,8 @@ void compute_all_dominators(dragon_node *nodes, size_t count) } + unref_instr_link(source); + } g_arch_instruction_unlock_src(node->first); diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index ffdee36..381aedc 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -56,7 +56,7 @@ void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) { size_t count; /* Nbre de sources affichées */ bool has_src; /* Présence de sources ? */ - instr_link_t *other; /* Instruction diverse liée */ + const instr_link_t *other; /* Instruction diverse liée */ size_t i; /* Boucle de parcours */ bool no_natural; /* Aucun lien naturel présent */ bool no_need; /* Pas de besoin pour ce lien */ @@ -79,6 +79,8 @@ void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) if (other->type != ILT_REF) has_src = true; + unref_instr_link(other); + } g_arch_instruction_unlock_src(instr); @@ -135,6 +137,8 @@ void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) } + unref_instr_link(other); + } check_done: @@ -173,6 +177,8 @@ void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) } + unref_instr_link(other); + } g_arch_instruction_unlock_src(instr); diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c index 9312917..40ce441 100644 --- a/src/analysis/disass/loop.c +++ b/src/analysis/disass/loop.c @@ -51,7 +51,7 @@ static void detect_back_edges(dragon_node *nodes, size_t count) GArchInstruction *last; /* Instruction finale de noeud */ size_t dcount; /* Nombre de liens de dest. */ size_t i; /* Boucle de parcours #2 */ - instr_link_t *dest; /* Instr. visée par une autre */ + const instr_link_t *dest; /* Instr. visée par une autre */ dragon_node *target; /* Noeud référence à tester */ size_t id; /* Indice du bit associé */ @@ -104,6 +104,8 @@ static void detect_back_edges(dragon_node *nodes, size_t count) } + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(last); diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c index c31fd58..6e737a5 100644 --- a/src/analysis/disass/rank.c +++ b/src/analysis/disass/rank.c @@ -63,7 +63,7 @@ static bool rank_flow_block(GFlowBlock *block, BlockVisitOrder order, const GIns GArchInstruction *last; /* Dernière instruction du bloc*/ size_t dcount; /* Nombre de liens de dest. */ size_t i; /* Boucle de parcours */ - instr_link_t *dest; /* Instr. visée par une autre */ + const instr_link_t *dest; /* Instr. visée par une autre */ const mrange_t *range; /* Emplacement d'une cible */ GFlowBlock *target; /* Bloc ciblé par un lien */ unsigned int rank; /* Rang à constituer */ @@ -167,6 +167,8 @@ static bool rank_flow_block(GFlowBlock *block, BlockVisitOrder order, const GIns } + unref_instr_link(dest); + if (target != NULL) { rank = MAX(next, g_flow_block_get_rank(target)); @@ -308,7 +310,7 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) GArchInstruction *last; /* Dernière instruction du bloc*/ size_t dcount; /* Nombre de liens de dest. */ size_t i; /* Boucle de parcours */ - instr_link_t *dest; /* Instr. visée par une autre */ + const instr_link_t *dest; /* Instr. visée par une autre */ InstructionLinkType type; /* Raccourci pour confort */ GBasicBlock *target; /* Bloc ciblé par un lien */ unsigned int rank; /* Rang à constituer */ @@ -327,7 +329,7 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) type = dest->type; /* La boucle de remontée n'abaisse pas les rangs */ - if (type == ILT_LOOP) continue; + if (type == ILT_LOOP) goto next_dest; /** * On se doit de suivre le même cheminement que celui emprunté lors @@ -339,7 +341,7 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) && type != ILT_CASE_JUMP && type != ILT_JUMP_IF_TRUE && type != ILT_JUMP_IF_FALSE) - continue; + goto next_dest; target = g_block_list_find_by_starting_instr(list, dest->linked); @@ -368,6 +370,10 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) } + next_dest: + + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(last); diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 1d03ad7..3b47930 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -1038,7 +1038,7 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi GArchInstruction *instr; /* Instruction correspondante */ size_t dcount; /* Nombre de liens de dest. */ size_t i; /* Boucle de parcours */ - instr_link_t *dest; /* Instr. visée par une autre */ + const instr_link_t *dest; /* Instr. visée par une autre */ const mrange_t *irange; /* Emplacement d'instruction */ GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Indice de ligne à traiter */ @@ -1102,12 +1102,12 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi call_count++; if (call_count > max_calls) - continue; + goto next_dest; if (call_count == max_calls) { call_info = stradd(call_info, "\n ..."); - continue; + goto next_dest; } irange = g_arch_instruction_get_range(instr); @@ -1150,20 +1150,20 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi case ILT_REF: if (!G_IS_RAW_INSTRUCTION(dest->linked)) - continue; + goto next_dest; if (!g_raw_instruction_is_string(G_RAW_INSTRUCTION(dest->linked))) - continue; + goto next_dest; string_count++; if (string_count > max_strings) - continue; + goto next_dest; if (string_count == max_strings) { string_info = stradd(string_info, "\n ..."); - continue; + goto next_dest; } irange = g_arch_instruction_get_range(dest->linked); @@ -1208,6 +1208,10 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi } + next_dest: + + unref_instr_link(dest); + } g_arch_instruction_unlock_dest(instr); |