From df13e4f2fc1dc38b3f2cd1305a4aef5bfd65253e Mon Sep 17 00:00:00 2001 From: humeafo Date: Tue, 3 Jul 2018 23:20:07 +0800 Subject: [PATCH 1/4] CMakeList.txt: make plugins aware of single/multi path build configurations. --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d8d62c6..c2c7881 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,14 @@ execute_process(COMMAND ${LLVM_CONFIG} "--cxxflags" OUTPUT_VARIABLE LLVM_CXXFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) +if(WITH_TARGET MATCHES "s2e") + add_definitions("-DCONFIG_SYMBEX=1") + set(WITH_SYMBEX ON) + if(NOT (WITH_TARGET MATCHES "s2e_sp")) + add_definitions("-DCONFIG_SYMBEX_MP=1") + set(WITH_SYMBEX_MP ON) + endif() +endif() ################## find_package(LIBQ REQUIRED) From 05fc9871c570c254ee47a375f2f82820550bcf65 Mon Sep 17 00:00:00 2001 From: humeafo Date: Tue, 3 Jul 2018 23:43:32 +0800 Subject: [PATCH 2/4] SeedSearcher: some tweaks to make seed scheduling work in single path mode. --- src/s2e/Plugins/Searchers/SeedScheduler.cpp | 5 +++++ src/s2e/Plugins/Searchers/SeedSearcher.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/s2e/Plugins/Searchers/SeedScheduler.cpp b/src/s2e/Plugins/Searchers/SeedScheduler.cpp index 2529a3e..0db0332 100644 --- a/src/s2e/Plugins/Searchers/SeedScheduler.cpp +++ b/src/s2e/Plugins/Searchers/SeedScheduler.cpp @@ -27,7 +27,12 @@ void SeedScheduler::initialize() { m_timeOfLastCrash = now; m_timeOfLastHighPrioritySeed = now; m_timeOfLastFetchedSeed = now; + +#if defined(CONFIG_SYMBEX) && defined(CONFIG_SYMBEX_MP) m_explorationState = WARM_UP; +#else + m_explorationState = WAIT_FOR_NEW_SEEDS; +#endif m_seeds = s2e()->getPlugin(); m_seeds->onSeed.connect(sigc::mem_fun(*this, &SeedScheduler::onSeed)); diff --git a/src/s2e/Plugins/Searchers/SeedSearcher.cpp b/src/s2e/Plugins/Searchers/SeedSearcher.cpp index 1491758..c42db83 100644 --- a/src/s2e/Plugins/Searchers/SeedSearcher.cpp +++ b/src/s2e/Plugins/Searchers/SeedSearcher.cpp @@ -202,7 +202,9 @@ void SeedSearcher::update(klee::ExecutionState *current, const klee::StateSet &a // This can only happen if state 0 dies for some reason if (es == m_initialState) { +#if defined(CONFIG_SYMBEX) && defined(CONFIG_SYMBEX_MP) s2e_warn_assert(cs, false, "Initial state no longer exists, seed look up is not possible"); +#endif m_initialState = NULL; m_selectSeedState = false; } @@ -469,7 +471,11 @@ void SeedSearcher::handleGetSeedFile(S2EExecutionState *state, S2E_SEEDSEARCHER_ m_selectSeedState = false; +#if defined(CONFIG_SYMBEX) && defined(CONFIG_SYMBEX_MP) cmd.GetFile.Result = 2; +#else + cmd.GetFile.Result = 3; +#endif if (state == m_initialState) { plgState->seedIndex = m_currentSeed.index; From 565825783693aec6539d6ffcd8d3a490b33454b3 Mon Sep 17 00:00:00 2001 From: humeafo Date: Wed, 4 Jul 2018 10:33:13 +0800 Subject: [PATCH 3/4] CMakeLists.txt: revert macros configuration because this not necessary --- CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c2c7881..d8d62c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,14 +45,6 @@ execute_process(COMMAND ${LLVM_CONFIG} "--cxxflags" OUTPUT_VARIABLE LLVM_CXXFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) -if(WITH_TARGET MATCHES "s2e") - add_definitions("-DCONFIG_SYMBEX=1") - set(WITH_SYMBEX ON) - if(NOT (WITH_TARGET MATCHES "s2e_sp")) - add_definitions("-DCONFIG_SYMBEX_MP=1") - set(WITH_SYMBEX_MP ON) - endif() -endif() ################## find_package(LIBQ REQUIRED) From b2fca2ffd796f03ff54f2a8a5b3bc8f88e9ccf3c Mon Sep 17 00:00:00 2001 From: humeafo Date: Wed, 4 Jul 2018 11:11:23 +0800 Subject: [PATCH 4/4] SeedSearcher: refactored to remove magic numbers --- src/s2e/Plugins/Searchers/SeedScheduler.cpp | 2 ++ src/s2e/Plugins/Searchers/SeedSearcher.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/s2e/Plugins/Searchers/SeedScheduler.cpp b/src/s2e/Plugins/Searchers/SeedScheduler.cpp index 0db0332..0f1d24a 100644 --- a/src/s2e/Plugins/Searchers/SeedScheduler.cpp +++ b/src/s2e/Plugins/Searchers/SeedScheduler.cpp @@ -31,6 +31,8 @@ void SeedScheduler::initialize() { #if defined(CONFIG_SYMBEX) && defined(CONFIG_SYMBEX_MP) m_explorationState = WARM_UP; #else + // warm up phase is intended for multi path mode only, in single path mode + // we do not want to waste cpu cycles to let guest waiting for seeds m_explorationState = WAIT_FOR_NEW_SEEDS; #endif diff --git a/src/s2e/Plugins/Searchers/SeedSearcher.cpp b/src/s2e/Plugins/Searchers/SeedSearcher.cpp index c42db83..ae05258 100644 --- a/src/s2e/Plugins/Searchers/SeedSearcher.cpp +++ b/src/s2e/Plugins/Searchers/SeedSearcher.cpp @@ -448,10 +448,10 @@ void SeedSearcher::handleGetSeedFile(S2EExecutionState *state, S2E_SEEDSEARCHER_ if (!m_selectSeedState) { if (m_states.size() > 1 || alreadyExplored) { - cmd.GetFile.Result = 0; + cmd.GetFile.Result = SEED_GETFILE_FAIL_NO_FORK; } else { alreadyExplored = true; - cmd.GetFile.Result = 1; + cmd.GetFile.Result = SEED_GETFILE_FAIL_DO_FORK; } getDebugStream(state) << "no seeds available\n"; @@ -472,9 +472,9 @@ void SeedSearcher::handleGetSeedFile(S2EExecutionState *state, S2E_SEEDSEARCHER_ m_selectSeedState = false; #if defined(CONFIG_SYMBEX) && defined(CONFIG_SYMBEX_MP) - cmd.GetFile.Result = 2; + cmd.GetFile.Result = SEED_GETFILE_SUCC_DO_FORK; #else - cmd.GetFile.Result = 3; + cmd.GetFile.Result = SEED_GETFILE_SUCC_NO_FORK; #endif if (state == m_initialState) {