diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/limit.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/src/analysis/disass/limit.c b/src/analysis/disass/limit.c index 4fb219a..103f878 100644 --- a/src/analysis/disass/limit.c +++ b/src/analysis/disass/limit.c @@ -24,6 +24,9 @@ #include "limit.h" +#include <assert.h> + + /****************************************************************************** * * @@ -45,8 +48,9 @@ void compute_routine_limit(GBinSymbol *symbol, const vmpa2t *next, GArchProcesso const mrange_t *range; /* Emplacement courant */ vmpa2t addr; /* Adresse à conserver */ GArchInstruction *start; /* Première instruction */ - phys_t diff; /* Taille définie par déduction*/ GBinPortion *portion; /* Conteneur avec limites */ + phys_t pdiff; /* Différence avec ces limites */ + phys_t diff; /* Taille définie par déduction*/ mrange_t new; /* Nouvel emplacement taillé */ range = g_binary_symbol_get_range(symbol); @@ -70,25 +74,37 @@ void compute_routine_limit(GBinSymbol *symbol, const vmpa2t *next, GArchProcesso g_object_unref(G_OBJECT(start)); + /* Dans tous les cas, on va se référer à la portion contenante... */ + + portion = g_binary_portion_find_at_addr(portions, &addr, (GdkRectangle []) { }); + assert(portion != NULL); + + range = g_binary_portion_get_range(portion); + + pdiff = compute_vmpa_diff(&addr, get_mrange_addr(range)); + pdiff = get_mrange_length(range) - pdiff; + + g_object_unref(G_OBJECT(portion)); + /* Si on peut se raccrocher à la prochaine adresse... */ if (next != NULL) - diff = compute_vmpa_diff(&addr, next); - - /* Sinon on va jusqu'à la fin de la zone ! */ - else { - portion = g_binary_portion_find_at_addr(portions, &addr, (GdkRectangle []) { }); - if (portion == NULL) goto crl_skip; - - range = g_binary_portion_get_range(portion); + diff = compute_vmpa_diff(&addr, next); - diff = compute_vmpa_diff(&addr, get_mrange_addr(range)); - diff = get_mrange_length(range) - diff; + /** + * On considère qu'un symbole ne peut pas déborder d'un segment + * sur un autre. + */ - g_object_unref(G_OBJECT(portion)); + if (diff > pdiff) + diff = pdiff; } + /* Sinon on va jusqu'à la fin de la zone ! */ + else + diff = pdiff; + init_mrange(&new, &addr, diff); g_binary_symbol_set_range(symbol, &new); |