From 2b431ba179258e63a1a80e611e4294265e61b27c Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Tue, 11 Jun 2019 21:56:37 +0200 Subject: [PATCH] mc: don't catch exceptions we cannot deal with + cosmetics using xbt_assert to improve coverage --- src/mc/Session.cpp | 30 +++++----------- src/mc/checker/simgrid_mc.cpp | 66 ++++++++++++++--------------------- 2 files changed, 35 insertions(+), 61 deletions(-) diff --git a/src/mc/Session.cpp b/src/mc/Session.cpp index 4d73338e5f..8c0926ef6a 100644 --- a/src/mc/Session.cpp +++ b/src/mc/Session.cpp @@ -27,18 +27,14 @@ static void setup_child_environment(int socket) // Make sure we do not outlive our parent: sigset_t mask; sigemptyset (&mask); - if (sigprocmask(SIG_SETMASK, &mask, nullptr) < 0) - throw simgrid::xbt::errno_error("Could not unblock signals"); - if (prctl(PR_SET_PDEATHSIG, SIGHUP) != 0) - throw simgrid::xbt::errno_error("Could not PR_SET_PDEATHSIG"); + xbt_assert(sigprocmask(SIG_SETMASK, &mask, nullptr) >= 0, "Could not unblock signals"); + xbt_assert(prctl(PR_SET_PDEATHSIG, SIGHUP) == 0, "Could not PR_SET_PDEATHSIG"); #endif - int res; - // Remove CLOEXEC in order to pass the socket to the exec-ed program: int fdflags = fcntl(socket, F_GETFD, 0); - if (fdflags == -1 || fcntl(socket, F_SETFD, fdflags & ~FD_CLOEXEC) == -1) - throw simgrid::xbt::errno_error("Could not remove CLOEXEC for socket"); + xbt_assert(fdflags != -1 && fcntl(socket, F_SETFD, fdflags & ~FD_CLOEXEC) != -1, + "Could not remove CLOEXEC for socket"); // Set environment: setenv(MC_ENV_VARIABLE, "1", 1); @@ -49,9 +45,8 @@ static void setup_child_environment(int socket) setenv("LC_BIND_NOW", "1", 1); char buffer[64]; - res = std::snprintf(buffer, sizeof(buffer), "%i", socket); - if ((size_t) res >= sizeof(buffer) || res == -1) - std::abort(); + int res = std::snprintf(buffer, sizeof(buffer), "%i", socket); + xbt_assert((size_t)res < sizeof(buffer) && res != -1); setenv(MC_ENV_SOCKET_FD, buffer, 1); } @@ -61,20 +56,13 @@ static inline pid_t do_fork(F code) { pid_t pid = fork(); - if (pid < 0) - throw simgrid::xbt::errno_error("Could not fork model-checked process"); + xbt_assert(pid >= 0, "Could not fork model-checked process"); if (pid != 0) return pid; // Child-process: - try { - code(); - _exit(EXIT_SUCCESS); - } - catch(...) { - // The callback should catch exceptions: - std::terminate(); - } + code(); + _exit(EXIT_SUCCESS); } Session::Session(const std::function& code) diff --git a/src/mc/checker/simgrid_mc.cpp b/src/mc/checker/simgrid_mc.cpp index 0c59749710..010cbfecca 100644 --- a/src/mc/checker/simgrid_mc.cpp +++ b/src/mc/checker/simgrid_mc.cpp @@ -25,7 +25,7 @@ char** argvdup(int argc, char** argv) return argv_copy; } -static std::unique_ptr createChecker(simgrid::mc::Session& session) +static std::unique_ptr create_checker(simgrid::mc::Session& session) { if (_sg_mc_comms_determinism || _sg_mc_send_determinism) return std::unique_ptr(simgrid::mc::createCommunicationDeterminismChecker(session)); @@ -37,48 +37,34 @@ static std::unique_ptr createChecker(simgrid::mc::Session& int main(int argc, char** argv) { - using simgrid::mc::Session; + if (argc < 2) + xbt_die("Missing arguments.\n"); - try { - if (argc < 2) - xbt_die("Missing arguments.\n"); - - // Currently, we need this before sg_config_init: - _sg_do_model_check = 1; + // Currently, we need this before sg_config_init: + _sg_do_model_check = 1; - // The initialization function can touch argv. - // We make a copy of argv before modifying it in order to pass the original - // value to the model-checked: - char** argv_copy = argvdup(argc, argv); - xbt_log_init(&argc, argv); - sg_config_init(&argc, argv); + // The initialization function can touch argv. + // We make a copy of argv before modifying it in order to pass the original + // value to the model-checked: + char** argv_copy = argvdup(argc, argv); + xbt_log_init(&argc, argv); + sg_config_init(&argc, argv); - simgrid::mc::session = new Session([argv_copy] { - execvp(argv_copy[1], argv_copy+1); - }); - delete[] argv_copy; + simgrid::mc::session = new simgrid::mc::Session([argv_copy] { execvp(argv_copy[1], argv_copy + 1); }); + delete[] argv_copy; - std::unique_ptr checker = createChecker(*simgrid::mc::session); - int res = SIMGRID_MC_EXIT_SUCCESS; - try { - checker->run(); - } catch (const simgrid::mc::DeadlockError&) { - res = SIMGRID_MC_EXIT_DEADLOCK; - } catch (const simgrid::mc::TerminationError&) { - res = SIMGRID_MC_EXIT_NON_TERMINATION; - } catch (const simgrid::mc::LivenessError&) { - res = SIMGRID_MC_EXIT_LIVENESS; - } - checker = nullptr; - simgrid::mc::session->close(); - return res; - } - catch(std::exception& e) { - XBT_ERROR("Exception: %s", e.what()); - return SIMGRID_MC_EXIT_ERROR; - } - catch(...) { - XBT_ERROR("Unknown exception"); - return SIMGRID_MC_EXIT_ERROR; + std::unique_ptr checker = create_checker(*simgrid::mc::session); + int res = SIMGRID_MC_EXIT_SUCCESS; + try { + checker->run(); + } catch (const simgrid::mc::DeadlockError&) { + res = SIMGRID_MC_EXIT_DEADLOCK; + } catch (const simgrid::mc::TerminationError&) { + res = SIMGRID_MC_EXIT_NON_TERMINATION; + } catch (const simgrid::mc::LivenessError&) { + res = SIMGRID_MC_EXIT_LIVENESS; } + checker = nullptr; + simgrid::mc::session->close(); + return res; } -- 2.20.1