summaryrefslogtreecommitdiff
path: root/src/analysis/disass/macro.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/macro.c')
-rw-r--r--src/analysis/disass/macro.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/analysis/disass/macro.c b/src/analysis/disass/macro.c
index 96a3b25..9527457 100644
--- a/src/analysis/disass/macro.c
+++ b/src/analysis/disass/macro.c
@@ -40,6 +40,8 @@
/* Bornes d'une zone à couvrir */
typedef struct _code_coverage
{
+ bool initial; /* Couverture racine ? */
+
mrange_t range; /* Couverture totale */
vmpa2t start; /* Position butoir de début */
@@ -209,6 +211,8 @@ static code_coverage *create_code_coverage(const mrange_t *range)
result = (code_coverage *)calloc(1, sizeof(code_coverage));
+ result->initial = true;
+
copy_mrange(&result->range, range);
copy_vmpa(&result->start, get_mrange_addr(range));
@@ -251,6 +255,8 @@ static code_coverage *dup_code_coverage(const code_coverage *src, const vmpa2t *
result = (code_coverage *)calloc(1, sizeof(code_coverage));
+ result->initial = false;
+
copy_mrange(&result->range, &src->range);
copy_vmpa(&result->start, new);
@@ -261,10 +267,15 @@ static code_coverage *dup_code_coverage(const code_coverage *src, const vmpa2t *
for (i = 0; i < result->ends_count; i++)
copy_vmpa(&result->ends[i], &src->ends[i]);
- result->processed = (unsigned long *)calloc(src->allocated, sizeof(unsigned long));
- result->allocated = src->allocated;
+ /**
+ * Les blocs produits par le découpage sont à accès global, et ne sont donc pas
+ * la propriété d'une branche particulière.
+ * Il ne faut donc pas créer deux blocs identiques à partir de deux chemins
+ * différents ; aussi on partage la couverture de code plutôt que la copier.
+ * Et, par ailleurs, c'est plus simple & efficace.
+ */
- memcpy(result->processed, src->processed, src->allocated * sizeof(unsigned long));
+ result->processed = src->processed;
return result;
@@ -287,7 +298,8 @@ static void delete_code_coverage(code_coverage *coverage)
{
free(coverage->ends);
- free(coverage->processed);
+ if (coverage->initial)
+ free(coverage->processed);
free(coverage);