From: Gabriel Corona Date: Tue, 22 Mar 2016 14:31:10 +0000 (+0100) Subject: [mc] Do not use a dangerous guess-the-type logic in snapshot_compare() X-Git-Tag: v3_13~327^2~18 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/30e424f828536f2e59c0175b482e6e5480fe7fdd [mc] Do not use a dangerous guess-the-type logic in snapshot_compare() --- diff --git a/src/mc/mc_compare.cpp b/src/mc/mc_compare.cpp index 22dbfaf170..825113fa74 100644 --- a/src/mc/mc_compare.cpp +++ b/src/mc/mc_compare.cpp @@ -64,8 +64,6 @@ struct ComparisonState { using simgrid::mc::ComparisonState; -extern "C" { - /************************** Snapshot comparison *******************************/ /******************************************************************************/ @@ -348,31 +346,14 @@ static int compare_local_variables(int process_index, return 0; } -int snapshot_compare(void *state1, void *state2) +namespace simgrid { +namespace mc { + +static +int snapshot_compare(int num1, simgrid::mc::Snapshot* s1, int num2, simgrid::mc::Snapshot* s2) { simgrid::mc::Process* process = &mc_model_checker->process(); - simgrid::mc::Snapshot* s1; - simgrid::mc::Snapshot* s2; - int num1, num2; - - if (_sg_mc_liveness) { /* Liveness MC */ - s1 = ((simgrid::mc::VisitedPair*) state1)->graph_state->system_state; - s2 = ((simgrid::mc::VisitedPair*) state2)->graph_state->system_state; - num1 = ((simgrid::mc::VisitedPair*) state1)->num; - num2 = ((simgrid::mc::VisitedPair*) state2)->num; - }else if (_sg_mc_termination) { /* Non-progressive cycle MC */ - s1 = ((mc_state_t) state1)->system_state; - s2 = ((mc_state_t) state2)->system_state; - num1 = ((mc_state_t) state1)->num; - num2 = ((mc_state_t) state2)->num; - } else { /* Safety or comm determinism MC */ - s1 = ((simgrid::mc::VisitedState*) state1)->system_state; - s2 = ((simgrid::mc::VisitedState*) state2)->system_state; - num1 = ((simgrid::mc::VisitedState*) state1)->num; - num2 = ((simgrid::mc::VisitedState*) state2)->num; - } - int errors = 0; int res_init; @@ -560,7 +541,34 @@ int snapshot_compare(void *state1, void *state2) #endif return errors > 0 || hash_result; +} +int snapshot_compare(simgrid::mc::VisitedPair* state1, simgrid::mc::VisitedPair* state2) +{ + simgrid::mc::Snapshot* s1 = state1->graph_state->system_state; + simgrid::mc::Snapshot* s2 = state2->graph_state->system_state; + int num1 = state1->num; + int num2 = state2->num; + return snapshot_compare(num1, s1, num2, s2); } +int snapshot_compare(mc_state_t state1, mc_state_t state2) +{ + simgrid::mc::Snapshot* s1 = state1->system_state; + simgrid::mc::Snapshot* s2 = state2->system_state; + int num1 = state1->num; + int num2 = state2->num; + return snapshot_compare(num1, s1, num2, s2); +} + +int snapshot_compare(simgrid::mc::VisitedState* state1, simgrid::mc::VisitedState* state2) +{ + simgrid::mc::Snapshot* s1 = state1->system_state; + simgrid::mc::Snapshot* s2 = state2->system_state; + int num1 = state1->num; + int num2 = state2->num; + return snapshot_compare(num1, s1, num2, s2); +} + +} } diff --git a/src/mc/mc_liveness.h b/src/mc/mc_liveness.h index b8fbd019f0..0b5b2daa08 100644 --- a/src/mc/mc_liveness.h +++ b/src/mc/mc_liveness.h @@ -67,6 +67,8 @@ XBT_PRIVATE void dump_stack_liveness(xbt_fifo_t stack); XBT_PRIVATE extern xbt_dynar_t visited_pairs; XBT_PRIVATE int is_visited_pair(simgrid::mc::VisitedPair* visited_pair, simgrid::mc::Pair* pair); +XBT_PRIVATE int snapshot_compare(simgrid::mc::VisitedPair* state1, simgrid::mc::VisitedPair* state2); + } } diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 28f1178c21..23c17b0c52 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -80,8 +80,6 @@ XBT_PRIVATE void MC_print_statistics(mc_stats_t stats); /********************************** Snapshot comparison **********************************/ -XBT_PRIVATE int snapshot_compare(void *state1, void *state2); - //#define MC_DEBUG 1 #define MC_VERBOSE 1 diff --git a/src/mc/mc_safety.h b/src/mc/mc_safety.h index 8e7503f4da..0bbe379011 100644 --- a/src/mc/mc_safety.h +++ b/src/mc/mc_safety.h @@ -44,6 +44,7 @@ struct XBT_PRIVATE VisitedState { extern XBT_PRIVATE std::vector> visited_states; XBT_PRIVATE std::unique_ptr is_visited_state(mc_state_t graph_state); +XBT_PRIVATE int snapshot_compare(simgrid::mc::VisitedState* state1, simgrid::mc::VisitedState* state2); } } diff --git a/src/mc/mc_state.h b/src/mc/mc_state.h index 292d15ceb2..93b350ffee 100644 --- a/src/mc/mc_state.h +++ b/src/mc/mc_state.h @@ -68,4 +68,12 @@ XBT_PRIVATE void MC_state_remove_interleave_process(mc_state_t state, smx_proces SG_END_DECL() +namespace simgrid { +namespace mc { + +XBT_PRIVATE int snapshot_compare(mc_state_t state1, mc_state_t state2); + +} +} + #endif