diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-02-05 22:03:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-02-05 22:03:38 (GMT) |
commit | 17f591f2230ac66394467d5e5eefe71cb259637d (patch) | |
tree | 1664e994b2904e5e9009027fc57749a11667365b /src/analysis/routine.c | |
parent | ff187d24b7441e88e1f0361d59b0f6f55851791f (diff) |
Fixed a huge number of memory leaks.
Diffstat (limited to 'src/analysis/routine.c')
-rw-r--r-- | src/analysis/routine.c | 95 |
1 files changed, 93 insertions, 2 deletions
diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 4116044..8b49456 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -81,6 +81,12 @@ static void g_bin_routine_class_init(GBinRoutineClass *); /* Initialise une instance représentation de routine. */ static void g_bin_routine_init(GBinRoutine *); +/* Procède à la libération totale de la mémoire. */ +static void g_bin_routine_finalize(GBinRoutine *); + +/* Supprime toutes les références externes. */ +static void g_bin_routine_dispose(GBinRoutine *); + /* Fournit une étiquette pour viser une routine. */ static char *g_binary_routine_get_label(const GBinRoutine *); @@ -104,8 +110,14 @@ G_DEFINE_TYPE(GBinRoutine, g_bin_routine, G_TYPE_BIN_SYMBOL); static void g_bin_routine_class_init(GBinRoutineClass *klass) { + GObjectClass *object; /* Version de base de la classe*/ GBinSymbolClass *symbol; /* Autre version de la classe */ + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_bin_routine_dispose; + object->finalize = (GObjectFinalizeFunc)g_bin_routine_finalize; + symbol = G_BIN_SYMBOL_CLASS(klass); symbol->get_label = (get_symbol_label_fc)g_binary_routine_get_label; @@ -133,6 +145,86 @@ static void g_bin_routine_init(GBinRoutine *routine) g_binary_symbol_set_target_type(symbol, STP_ROUTINE); + routine->ret_type = NULL; + + routine->namespace = NULL; + routine->ns_sep = NULL; + routine->name = NULL; + routine->full_name = NULL; + + routine->args = NULL; + routine->args_count = 0; + + routine->locals = NULL; + routine->locals_count = 0; + + routine->blocks = NULL; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_bin_routine_dispose(GBinRoutine *routine) +{ + size_t i; /* Boucle de parcours */ + + g_clear_object(&routine->ret_type); + + g_clear_object(&routine->namespace); + g_clear_object(&routine->full_name); + + for (i = 0; i < routine->args_count; i++) + g_clear_object(&routine->args[i]); + + for (i = 0; i < routine->locals_count; i++) + g_clear_object(&routine->locals[i]); + + g_clear_object(&routine->blocks); + + G_OBJECT_CLASS(g_bin_routine_parent_class)->dispose(G_OBJECT(routine)); + +} + + +/****************************************************************************** +* * +* Paramètres : routine = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_bin_routine_finalize(GBinRoutine *routine) +{ + if (routine->ns_sep != NULL) + free(routine->ns_sep); + + if (routine->name != NULL) + free(routine->name); + + if (routine->args != NULL) + free(routine->args); + + if (routine->locals != NULL) + free(routine->locals); + + G_OBJECT_CLASS(g_bin_routine_parent_class)->finalize(G_OBJECT(routine)); + } @@ -736,8 +828,7 @@ GBlockList *g_binary_routine_get_basic_blocks(const GBinRoutine *routine) void g_binary_routine_set_basic_blocks(GBinRoutine *routine, GBlockList *blocks) { - if (routine->blocks != NULL) - g_object_unref(G_OBJECT(routine->blocks)); + g_clear_object(&routine->blocks); routine->blocks = blocks; |