From: Marion Guthmuller Date: Fri, 11 Jan 2013 16:58:14 +0000 (+0100) Subject: model-checker : free memory X-Git-Tag: v3_9_rc1~86^2~17 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/dbc517ef081558bd3c91c852f436f0b7312a22e1 model-checker : free memory --- diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index b3dd6ca964..eda45c202c 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -139,7 +139,6 @@ mc_snapshot_t SIMIX_pre_mc_snapshot(smx_simcall_t simcall){ mc_snapshot_t MC_take_snapshot() { - int raw_mem = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -232,6 +231,7 @@ void MC_free_snapshot(mc_snapshot_t snapshot) for(i=0; i < snapshot->num_reg; i++) MC_region_destroy(snapshot->regions[i]); + xbt_free(snapshot->regions); xbt_dynar_free(&(snapshot->stacks)); xbt_free(snapshot); } @@ -296,8 +296,8 @@ void get_libsimgrid_plt_section(){ } - free(command); - free(line); + xbt_free(command); + xbt_free(line); pclose(fp); } @@ -359,8 +359,8 @@ void get_binary_plt_section(){ } - free(command); - free(line); + xbt_free(command); + xbt_free(line); pclose(fp); } @@ -378,7 +378,7 @@ static void add_value(xbt_dynar_t *list, const char *type, unsigned long int val static xbt_dynar_t take_snapshot_stacks(void *heap){ - xbt_dynar_t res = xbt_dynar_new(sizeof(s_mc_snapshot_stack_t), NULL); + xbt_dynar_t res = xbt_dynar_new(sizeof(s_mc_snapshot_stack_t), snapshot_stack_free_voidp); unsigned int cursor1 = 0; stack_region_t current_stack; @@ -429,7 +429,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) unw_word_t ip, sp, off; dw_frame_t frame; - xbt_dynar_t compose = xbt_dynar_new(sizeof(variable_value_t), NULL); + xbt_dynar_t compose = xbt_dynar_new(sizeof(variable_value_t), variable_value_free_voidp); xbt_strbuff_t variables = xbt_strbuff_new(); xbt_dict_cursor_t dict_cursor; @@ -442,6 +442,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) int frame_found = 0; void *frame_pointer_address = NULL; long true_ip; + char *to_append; while(ret >= 0){ @@ -452,10 +453,15 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) frame = xbt_dict_get_or_null(mc_local_variables, frame_name); - if(frame == NULL) + if(frame == NULL){ + xbt_dynar_free(&compose); + xbt_dict_cursor_free(&dict_cursor); return variables; + } - xbt_strbuff_append(variables, bprintf("ip=%s\n", frame_name)); + to_append = bprintf("ip=%s\n", frame_name); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); true_ip = (long)frame->low_pc + (long)off; @@ -538,25 +544,37 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) if(xbt_dynar_length(compose) > 0){ if(strcmp(xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->type, "value") == 0){ - xbt_strbuff_append(variables, bprintf("%s=%lx\n", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res)); + to_append = bprintf("%s=%lx\n", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); }else{ if((long)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address < 0 || *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) == NULL){ - xbt_strbuff_append(variables, bprintf("%s=NULL\n", current_variable->name)); + to_append = bprintf("%s=NULL\n", current_variable->name); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); }else if(((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) > 0xffffffff) || ((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) < (long)start_text_binary)){ - xbt_strbuff_append(variables, bprintf("%s=%d\n", current_variable->name, (int)(long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address))); + to_append = bprintf("%s=%d\n", current_variable->name, (int)(long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address)); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); }else{ - xbt_strbuff_append(variables, bprintf("%s=%p\n", current_variable->name, *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address))); + to_append = bprintf("%s=%p\n", current_variable->name, *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address)); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); } } }else{ - xbt_strbuff_append(variables, bprintf("%s=undefined\n", current_variable->name)); + to_append = bprintf("%s=undefined\n", current_variable->name); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); } break; default : break; } }else{ - xbt_strbuff_append(variables, bprintf("%s=undefined\n", current_variable->name)); + to_append = bprintf("%s=undefined\n", current_variable->name); + xbt_strbuff_append(variables, to_append); + xbt_free(to_append); } } @@ -564,6 +582,9 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) } + xbt_dynar_free(&compose); + xbt_dict_cursor_free(&dict_cursor); + return variables; } @@ -596,3 +617,15 @@ void *MC_snapshot(void){ return simcall_mc_snapshot(); } + +void variable_value_free(variable_value_t v){ + if(v){ + xbt_free(v->type); + xbt_free(v); + } +} + +void variable_value_free_voidp(void* v){ + variable_value_free((variable_value_t) * (void **)v); +} + diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index 81e075e861..0e038ca554 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -148,7 +148,7 @@ int SIMIX_pre_mc_compare_snapshots(smx_simcall_t simcall, } int get_heap_region_index(mc_snapshot_t s){ - int i =0; + int i = 0; while(i < s->num_reg){ switch(s->regions[i]->type){ case 0: diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 6cd26b852d..186335f8b5 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -175,6 +175,9 @@ void MC_init(){ xbt_dict_t libsimgrid_location_list = MC_get_location_list(libsimgrid_path); MC_get_local_variables(libsimgrid_path, libsimgrid_location_list, &mc_local_variables); + xbt_dict_free(&libsimgrid_location_list); + xbt_dict_free(&binary_location_list); + /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */ get_libsimgrid_plt_section(); get_binary_plt_section(); @@ -1039,13 +1042,14 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ char *key = bprintf("%d", (int)strtoul((char *)xbt_dynar_get_as(split, 0, char *), NULL, 16)); xbt_dict_set(location_list, key, loclist, NULL); + xbt_free(key); xbt_dynar_free(&split); } - free(line); - free(command); + xbt_free(line); + xbt_free(command); pclose(fp); return location_list; @@ -1058,10 +1062,13 @@ static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long in dw_frame_t res; xbt_dict_foreach(all_variables, cursor, name, res) { - if(offset >= res->start && offset < res->end) + if(offset >= res->start && offset < res->end){ + xbt_dict_cursor_free(&cursor); return res; + } } + xbt_dict_cursor_free(&cursor); return NULL; } @@ -1168,11 +1175,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(abstract_origin, ">"); subprogram_name = (char *)xbt_dict_get_or_null(subprograms_origin, abstract_origin); frame = xbt_dict_get_or_null(*all_variables, subprogram_name); + xbt_free(abstract_origin); }else if(strcmp(node_type, "DW_AT_name") == 0){ new_frame = 1; - free(current_frame); + xbt_free(current_frame); frame = xbt_new0(s_dw_frame_t, 1); frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *)); frame->variables = xbt_dict_new_homogeneous(NULL); @@ -1198,6 +1206,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(loc_expr, ")"); frame->frame_base = get_location(NULL, loc_expr); xbt_dynar_free(&split2); + xbt_free(loc_expr); } @@ -1213,8 +1222,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ }else if(strcmp(node_type, "DW_AT_MIPS_linkage_name:") == 0){ - free(frame->name); - free(current_frame); + xbt_free(frame->name); + xbt_free(current_frame); frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *)); current_frame = strdup(frame->name); xbt_dict_set(subprograms_origin, subprogram_start, frame->name, NULL); @@ -1232,9 +1241,9 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_dict_set(*all_variables, frame->name, frame, NULL); } - free(subprogram_start); + xbt_free(subprogram_start); if(subprogram_end != NULL){ - free(subprogram_end); + xbt_free(subprogram_end); subprogram_end = NULL; } @@ -1314,6 +1323,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_rtrim(loc_expr, ")"); var->location = get_location(NULL, loc_expr); xbt_dynar_free(&split2); + xbt_free(loc_expr); } @@ -1402,8 +1412,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } xbt_dynar_free(&split); - free(line); - free(command); + xbt_free(line); + xbt_free(command); pclose(fp); } @@ -1417,8 +1427,9 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ char *key = bprintf("%d", (int)strtoul(expr, NULL, 16)); loc->type = e_dw_loclist; loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key); - if(loc == NULL) + if(loc->location.loclist == NULL) XBT_INFO("Key not found in loclist"); + xbt_free(key); return loc; }else{ @@ -1757,8 +1768,8 @@ static void MC_get_global_variables(char *elf_file){ } - free(command); - free(line); + xbt_free(command); + xbt_free(line); pclose(fp); } diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 240839c791..2424c4385d 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -412,6 +412,9 @@ typedef struct s_variable_value{ }value; }s_variable_value_t, *variable_value_t; +void variable_value_free_voidp(void* v); +void variable_value_free(variable_value_t v); + void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_dict_t *variables); void print_local_variables(xbt_dict_t list); char *get_libsimgrid_path(void); diff --git a/src/mc/mc_state.c b/src/mc/mc_state.c index 7faf1f1260..4d41ba1797 100644 --- a/src/mc/mc_state.c +++ b/src/mc/mc_state.c @@ -41,6 +41,8 @@ mc_state_t MC_state_pair_new(void) */ void MC_state_delete(mc_state_t state) { + if(state->system_state) + MC_free_snapshot(state->system_state); xbt_free(state->proc_status); xbt_free(state); }