ROSE 0.11.145.247
SemanticCallbacks.h
1#ifndef ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H
2#define ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_MODEL_CHECKER
5
6#include <Rose/BinaryAnalysis/ModelChecker/BasicTypes.h>
7
8#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h>
9#include <Rose/BinaryAnalysis/SmtSolver.h>
10#include <Rose/Yaml.h>
11
12#ifdef ROSE_HAVE_YAMLCPP
13#include <yaml-cpp/yaml.h>
14#endif
15
16namespace Rose {
17namespace BinaryAnalysis {
18namespace ModelChecker {
19
25class SemanticCallbacks {
26public:
28 using Ptr = SemanticCallbacksPtr;
29
30private:
31 const SettingsPtr mcSettings_; // model checker settings
32
33protected:
34 SemanticCallbacks() = delete;
35 explicit SemanticCallbacks(const SettingsPtr&);
36public:
37 virtual ~SemanticCallbacks();
38
39public:
41 // Functions for creating the semantics framework
43
50 virtual void reset() {}
51
57 SettingsPtr mcSettings() const;
58
68 virtual InstructionSemantics::BaseSemantics::SValuePtr protoval();
69
76 virtual InstructionSemantics::BaseSemantics::RegisterStatePtr createInitialRegisters() = 0;
77
84 virtual InstructionSemantics::BaseSemantics::MemoryStatePtr createInitialMemory() = 0;
85
93 virtual InstructionSemantics::BaseSemantics::StatePtr createInitialState();
94
112 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr createRiscOperators() = 0;
113
123 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr
124 configureRiscOperators(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
125
136 virtual SmtSolverPtr createSolver() = 0;
137
150 virtual void attachModelCheckerSolver(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
151 const SmtSolverPtr&) {}
152
161 virtual void initializeState(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
162
169 virtual InstructionSemantics::BaseSemantics::DispatcherPtr
170 createDispatcher(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
171
173 // State query functions
175
182 virtual InstructionSemantics::BaseSemantics::SValuePtr
183 instructionPointer(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
184
188 struct CodeAddresses {
189 InstructionSemantics::BaseSemantics::SValuePtr ip;
190 std::set<Address> addresses;
191 bool isComplete = true;
192 };
193
200 virtual CodeAddresses nextCodeAddresses(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
201
203 // Execution tree functions
205
224 virtual std::pair<bool, const char*> skipExecution(const PathPtr&);
225
236 virtual std::vector<TagPtr> preExecute(const PathNodePtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
237
248 virtual std::vector<TagPtr> postExecute(const PathNodePtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
249
251 struct NextUnit {
252 ExecutionUnitPtr unit;
253 SymbolicExpression::Ptr assertion;
254 SmtSolver::Evidence evidence;
255 };
256
272 virtual std::vector<NextUnit>
273 nextUnits(const PathPtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&, const SmtSolverPtr&) = 0;
274
276 // Path creation functions.
278
289#ifdef ROSE_HAVE_YAMLCPP
290 virtual std::list<ExecutionUnitPtr>
291 parsePath(const YAML::Node&, const std::string &sourceName) = 0;
292#endif
293 virtual std::list<ExecutionUnitPtr>
294 parsePath(const Yaml::Node&, const std::string &sourceName) = 0;
296};
297
298} // namespace
299} // namespace
300} // namespace
301
302#endif
303#endif
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.
The ROSE library.