summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-08-03 11:24:26 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-08-03 11:24:26 (GMT)
commit4d179bc994cf85832d08f468c7e4122ad23e9244 (patch)
tree3348d3c001c961e9e464a644c12c9fc85e78d9b5 /src/analysis
parent77735c8c77497498e3beb4f5bcec7de3b592fcbd (diff)
Updated the reference counters when providing instruction links.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/db/items/comment.c4
-rw-r--r--src/analysis/decomp/il.c4
-rw-r--r--src/analysis/disass/dragon.c20
-rw-r--r--src/analysis/disass/links.c8
-rw-r--r--src/analysis/disass/loop.c4
-rw-r--r--src/analysis/disass/rank.c14
-rw-r--r--src/analysis/routine.c18
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);