From 939d6874d114f5a39396f28aeb6ebc17a0dc652b Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 23 Jul 2013 23:32:30 -0700 Subject: BFS searcher. --- lib/Core/Searcher.cpp | 34 ++++++++++++++++++++++++++++++++++ lib/Core/Searcher.h | 17 ++++++++++++++++- lib/Core/UserSearcher.cpp | 2 ++ 3 files changed, 52 insertions(+), 1 deletion(-) (limited to 'lib/Core') diff --git a/lib/Core/Searcher.cpp b/lib/Core/Searcher.cpp index d08cd1b1..778ef0ef 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -88,6 +88,40 @@ void DFSSearcher::update(ExecutionState *current, /// +ExecutionState &BFSSearcher::selectState() { + return *states.front(); +} + +void BFSSearcher::update(ExecutionState *current, + const std::set &addedStates, + const std::set &removedStates) { + states.insert(states.end(), + addedStates.begin(), + addedStates.end()); + for (std::set::const_iterator it = removedStates.begin(), + ie = removedStates.end(); it != ie; ++it) { + ExecutionState *es = *it; + if (es == states.front()) { + states.pop_front(); + } else { + bool ok = false; + + for (std::deque::iterator it = states.begin(), + ie = states.end(); it != ie; ++it) { + if (es==*it) { + states.erase(it); + ok = true; + break; + } + } + + assert(ok && "invalid state removed"); + } + } +} + +/// + ExecutionState &RandomSearcher::selectState() { return *states[theRNG.getInt32()%states.size()]; } diff --git a/lib/Core/Searcher.h b/lib/Core/Searcher.h index 58772bbb..79c233c4 100644 --- a/lib/Core/Searcher.h +++ b/lib/Core/Searcher.h @@ -68,7 +68,8 @@ namespace klee { } enum CoreSearchType { - DFS, + DFS, + BFS, RandomState, RandomPath, NURS_CovNew, @@ -94,6 +95,20 @@ namespace klee { } }; + class BFSSearcher : public Searcher { + std::deque states; + + public: + ExecutionState &selectState(); + void update(ExecutionState *current, + const std::set &addedStates, + const std::set &removedStates); + bool empty() { return states.empty(); } + void printName(std::ostream &os) { + os << "BFSSearcher\n"; + } + }; + class RandomSearcher : public Searcher { std::vector states; diff --git a/lib/Core/UserSearcher.cpp b/lib/Core/UserSearcher.cpp index 361092d2..a20ae968 100644 --- a/lib/Core/UserSearcher.cpp +++ b/lib/Core/UserSearcher.cpp @@ -23,6 +23,7 @@ namespace { cl::list CoreSearch("search", cl::desc("Specify the search heuristic (default=random-path interleaved with nurs:covnew)"), cl::values(clEnumValN(Searcher::DFS, "dfs", "use Depth First Search (DFS)"), + clEnumValN(Searcher::BFS, "bfs", "use Breadth First Search (BFS)"), clEnumValN(Searcher::RandomState, "random-state", "randomly select a state to explore"), clEnumValN(Searcher::RandomPath, "random-path", "use Random Path Selection (see OSDI'08 paper)"), clEnumValN(Searcher::NURS_CovNew, "nurs:covnew", "use Non Uniform Random Search (NURS) with Coverage-New"), @@ -77,6 +78,7 @@ Searcher *getNewSearcher(Searcher::CoreSearchType type, Executor &executor) { Searcher *searcher = NULL; switch (type) { case Searcher::DFS: searcher = new DFSSearcher(); break; + case Searcher::BFS: searcher = new BFSSearcher(); break; case Searcher::RandomState: searcher = new RandomSearcher(); break; case Searcher::RandomPath: searcher = new RandomPathSearcher(executor); break; case Searcher::NURS_CovNew: searcher = new WeightedRandomSearcher(executor, WeightedRandomSearcher::CoveringNew); break; -- cgit 1.4.1