From 69806d75d7a3d7c0501d8205cd561447b52ac0b2 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 15 Jan 2019 23:02:24 +0100 Subject: Provided functions to compare links between code blocks. --- src/analysis/block-int.h | 4 ++++ src/analysis/block.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ src/analysis/block.h | 6 +++++ src/analysis/disass/block.c | 33 +++++++++++++++++++++++++++ 4 files changed, 98 insertions(+) diff --git a/src/analysis/block-int.h b/src/analysis/block-int.h index 8988091..8f97794 100644 --- a/src/analysis/block-int.h +++ b/src/analysis/block-int.h @@ -38,6 +38,9 @@ /* Détermine si un bloc de code contient une adresse donnée. */ typedef bool (* block_contains_fc) (const GCodeBlock *, const vmpa2t *); +/* Compare deux liens entre blocs de code. */ +typedef int (* block_compare_links_fc) (const block_link_t *, const block_link_t *); + /* Fournit les détails des origines d'un bloc de code donné. */ typedef block_link_t * (* block_get_links_fc) (const GCodeBlock *, const GBlockList *, size_t *); @@ -67,6 +70,7 @@ struct _GCodeBlockClass GObjectClass parent; /* A laisser en premier */ block_contains_fc contains; /* Possession d'une adresse */ + block_compare_links_fc cmp_links; /* Comparaison de liens */ block_get_links_fc get_src; /* Obtention des origines */ block_get_links_fc get_dest; /* Obtention des destinations */ block_build_view_fc build; /* Construction d'une vue */ diff --git a/src/analysis/block.c b/src/analysis/block.c index 8bc0d4b..9708ef4 100644 --- a/src/analysis/block.c +++ b/src/analysis/block.c @@ -367,6 +367,61 @@ GBufferView *g_code_block_get_view(GCodeBlock *block, segcnt_list *highlighted) /****************************************************************************** * * +* Paramètres : link_a = premier lien à traiter. * +* link_b = second lien à traiter. * +* * +* Description : Compare deux liens entre blocs de code. * +* * +* Retour : Bilan de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int g_code_block_compare_links(const block_link_t *link_a, const block_link_t *link_b) +{ + int result; /* Bilan à retourner */ + GCodeBlockClass *class; /* Classe des blocs de code */ + + assert(G_TYPE_FROM_INSTANCE(link_a->linked) == G_TYPE_FROM_INSTANCE(link_b->linked)); + + class = G_CODE_BLOCK_GET_CLASS(link_a->linked); + + result = class->cmp_links(link_a, link_b); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : link_a = premier lien à traiter. * +* link_b = second lien à traiter. * +* * +* Description : Compare deux liens entre blocs de code. * +* * +* Retour : Bilan de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int g_code_block_compare_links_reversed(const block_link_t *link_a, const block_link_t *link_b) +{ + int result; /* Bilan à retourner */ + + result = g_code_block_compare_links(link_a, link_b); + + result *= -1; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : block = bloc dont les informations sont à consulter. * * count = nombre de ces origines. [OUT] * * * diff --git a/src/analysis/block.h b/src/analysis/block.h index 4ae0def..71092b2 100644 --- a/src/analysis/block.h +++ b/src/analysis/block.h @@ -95,6 +95,12 @@ typedef struct _block_link_t #define unref_block_link(l) g_object_unref(G_OBJECT((l)->linked)); +/* Compare deux liens entre blocs de code. */ +int g_code_block_compare_links(const block_link_t *, const block_link_t *); + +/* Compare deux liens entre blocs de code. */ +int g_code_block_compare_links_reversed(const block_link_t *, const block_link_t *); + /* Fournit les détails des origines d'un bloc de code donné. */ block_link_t *g_code_block_get_sources(const GCodeBlock *, size_t *); diff --git a/src/analysis/disass/block.c b/src/analysis/disass/block.c index ec8cf2a..021284e 100644 --- a/src/analysis/disass/block.c +++ b/src/analysis/disass/block.c @@ -71,6 +71,9 @@ static void g_basic_block_finalize(GBasicBlock *); /* Détermine si un bloc de code contient une adresse donnée. */ static bool g_basic_block_contains_addr(const GBasicBlock *, const vmpa2t *); +/* Compare deux liens entre blocs de code. */ +static int g_basic_block_compare_links(const block_link_t *, const block_link_t *); + /* Fournit les détails des origines d'un bloc de code donné. */ static block_link_t *g_basic_block_get_sources(const GBasicBlock *, const GBlockList *, size_t *); @@ -116,6 +119,7 @@ static void g_basic_block_class_init(GBasicBlockClass *class) block = G_CODE_BLOCK_CLASS(class); block->contains = (block_contains_fc)g_basic_block_contains_addr; + block->cmp_links = (block_compare_links_fc)g_basic_block_compare_links; block->get_src = (block_get_links_fc)g_basic_block_get_sources; block->get_dest = (block_get_links_fc)g_basic_block_get_destinations; block->build = (block_build_view_fc)g_basic_block_build_view; @@ -275,6 +279,35 @@ static bool g_basic_block_contains_addr(const GBasicBlock *block, const vmpa2t * /****************************************************************************** * * +* Paramètres : link_a = premier lien à traiter. * +* link_b = second lien à traiter. * +* * +* Description : Compare deux liens entre blocs de code. * +* * +* Retour : Bilan de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int g_basic_block_compare_links(const block_link_t *link_a, const block_link_t *link_b) +{ + int result; /* Bilan à retourner */ + const mrange_t *range_a; /* Couverture d'instruction #1 */ + const mrange_t *range_b; /* Couverture d'instruction #2 */ + + range_a = g_arch_instruction_get_range(G_BASIC_BLOCK(link_a->linked)->first); + range_b = g_arch_instruction_get_range(G_BASIC_BLOCK(link_b->linked)->first); + + result = cmp_mrange(range_a, range_b); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : block = bloc dont les informations sont à consulter. * * list = ensemble des blocs de code à disposition. * * count = nombre de ces origines. [OUT] * -- cgit v0.11.2-87-g4458