1 #ifndef ROSE_BinaryAnalysis_Concolic_Database_H
2 #define ROSE_BinaryAnalysis_Concolic_Database_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_CONCOLIC_TESTING
5 #include <Rose/BinaryAnalysis/Concolic/BasicTypes.h>
7 #include <boost/numeric/conversion/cast.hpp>
9 #include <rose_strtoull.h>
10 #include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h>
11 #include <Sawyer/BiMap.h>
12 #include <Sawyer/Database.h>
13 #include <Sawyer/Optional.h>
17 namespace BinaryAnalysis {
38 Sawyer::Database::Connection connection_;
46 TestSuiteId testSuiteId_;
60 static Ptr instance(
const std::string &url);
63 Sawyer::Database::Connection connection() {
77 static Ptr create(
const std::string &url);
78 static Ptr create(
const std::string &url,
const std::string &testSuiteName);
89 std::vector<TestSuiteId> testSuites();
98 TestSuitePtr testSuite();
99 TestSuiteId testSuite(
const TestSuitePtr&);
110 std::vector<SpecimenId> specimens();
113 std::vector<SpecimenId> specimens(TestSuiteId);
116 void eraseSpecimens(TestSuiteId);
126 std::vector<TestCaseId> testCases();
129 std::vector<TestCaseId> testCases(SpecimenId);
132 void eraseTestCases(SpecimenId);
142 std::vector<ExecutionEventId> executionEvents();
147 std::vector<ExecutionEventId> executionEvents(TestCaseId);
150 size_t nExecutionEvents(TestCaseId);
156 std::vector<ExecutionEventId> executionEvents(TestCaseId, uint64_t primaryKey);
161 std::vector<ExecutionEventId> executionEventsSince(TestCaseId, ExecutionEventId startingAt);
166 std::vector<uint64_t> executionEventKeyFrames(TestCaseId);
169 void eraseExecutionEvents(TestCaseId);
181 TestSuitePtr object(TestSuiteId, Update update = Update::YES);
182 TestCasePtr object(TestCaseId, Update update = Update::YES);
183 SpecimenPtr object(SpecimenId, Update update = Update::YES);
184 ExecutionEventPtr object(ExecutionEventId, Update update = Update::YES);
195 TestSuiteId
id(
const TestSuitePtr&, Update update = Update::YES);
196 TestCaseId
id(
const TestCasePtr&, Update update = Update::YES);
197 SpecimenId
id(
const SpecimenPtr&, Update update = Update::YES);
198 ExecutionEventId
id(
const ExecutionEventPtr&, Update update = Update::YES);
204 TestSuiteId
erase(TestSuiteId);
205 TestCaseId
erase(TestCaseId);
206 SpecimenId
erase(SpecimenId);
207 ExecutionEventId
erase(ExecutionEventId);
214 template<
class ObjectPo
inter>
215 typename ObjectTraits<typename ObjectPointer::Pointee>::Id
216 save(
const ObjectPointer &obj) {
223 template<
class ObjectPo
inter>
224 void save(
const std::vector<ObjectPointer> &objects) {
225 for (
auto object: objects)
233 std::vector<typename Id::Pointer>
234 objects(
const std::vector<Id> &ids, Update update = Update::YES) {
235 std::vector<typename Id::Pointer> retval;
237 retval.push_back(
object(
id, update));
244 template<
class ObjectPo
inter>
245 std::vector<typename ObjectTraits<ObjectPointer>::Id>
246 ids(
const std::vector<ObjectPointer> &objects, Update update = Update::YES) {
247 std::vector<typename ObjectTraits<ObjectPointer>::Id> retval;
248 for (
auto object: objects)
249 retval.push_back(
id(
object, update));
259 TestSuitePtr findTestSuite(
const std::string &nameOrId);
265 std::vector<SpecimenId> findSpecimensByName(
const std::string &name);
277 bool rbaExists(SpecimenId);
287 void saveRbaFile(
const boost::filesystem::path&, SpecimenId);
297 void extractRbaFile(
const boost::filesystem::path&, SpecimenId);
304 void eraseRba(SpecimenId);
313 bool symbolicStateExists(TestCaseId);
329 void eraseSymbolicState(TestCaseId);
339 bool concreteResultExists(TestCaseId);
348 void saveConcreteResult(
const TestCasePtr&,
const ConcreteResultPtr&);
354 ConcreteResultPtr readConcreteResult(TestCaseId);
360 std::vector<TestCaseId> needConcreteTesting(
size_t n =
UNLIMITED);
374 void assocTestCaseWithTestSuite(TestCaseId, TestSuiteId);
380 std::vector<TestCaseId> needConcolicTesting(
size_t n =
UNLIMITED);
382 #if 0 // [Robb Matzke 2020-07-15]
391 void insertConcreteResults(
const TestCasePtr &testCase,
const ConcreteResult& details);
401 static std::string timestamp();
Main namespace for the ROSE library.
const size_t UNLIMITED(static_cast< size_t >(-1))
Effictively unlimited size.
One-to-one mapping between source and target values.
Reference-counting intrusive smart pointer.
boost::shared_ptr< State > StatePtr
Shared-ownership pointer to a semantic state.
Creates SharedPointer from this.
Id id(const std::string &name)
Returns the ID for an attribute name.
Base class for reference counted objects.
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
void erase(GlobalVariables &, const AddressInterval &toErase)
Erase some global variables.