ROSE 0.11.145.367
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
12namespace Rose {
13namespace BinaryAnalysis {
14namespace ModelChecker {
15
21class SemanticCallbacks {
22public:
24 using Ptr = SemanticCallbacksPtr;
25
26private:
27 const SettingsPtr mcSettings_; // model checker settings
28
29protected:
30 SemanticCallbacks() = delete;
31 explicit SemanticCallbacks(const SettingsPtr&);
32public:
33 virtual ~SemanticCallbacks();
34
35public:
37 // Functions for creating the semantics framework
39
46 virtual void reset() {}
47
53 SettingsPtr mcSettings() const;
54
64 virtual InstructionSemantics::BaseSemantics::SValuePtr protoval();
65
72 virtual InstructionSemantics::BaseSemantics::RegisterStatePtr createInitialRegisters() = 0;
73
80 virtual InstructionSemantics::BaseSemantics::MemoryStatePtr createInitialMemory() = 0;
81
89 virtual InstructionSemantics::BaseSemantics::StatePtr createInitialState();
90
108 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr createRiscOperators() = 0;
109
119 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr
120 configureRiscOperators(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
121
132 virtual SmtSolverPtr createSolver() = 0;
133
146 virtual void attachModelCheckerSolver(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
147 const SmtSolverPtr&) {}
148
157 virtual void initializeState(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
158
165 virtual InstructionSemantics::BaseSemantics::DispatcherPtr
166 createDispatcher(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
167
169 // State query functions
171
178 virtual InstructionSemantics::BaseSemantics::SValuePtr
179 instructionPointer(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
180
184 struct CodeAddresses {
185 InstructionSemantics::BaseSemantics::SValuePtr ip;
186 std::set<Address> addresses;
187 bool isComplete = true;
188 };
189
196 virtual CodeAddresses nextCodeAddresses(const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
197
199 // Execution tree functions
201
220 virtual std::pair<bool, const char*> skipExecution(const PathPtr&);
221
232 virtual std::vector<TagPtr> preExecute(const PathNodePtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
233
244 virtual std::vector<TagPtr> postExecute(const PathNodePtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
245
247 struct NextUnit {
248 ExecutionUnitPtr unit;
249 SymbolicExpression::Ptr assertion;
250 SmtSolver::Evidence evidence;
251 };
252
268 virtual std::vector<NextUnit>
269 nextUnits(const PathPtr&, const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&, const SmtSolverPtr&) = 0;
270
272 // Path creation functions.
274
283 virtual std::list<ExecutionUnitPtr> parsePath(const Yaml::Node&, const std::string &sourceName) = 0;
284};
285
286} // namespace
287} // namespace
288} // namespace
289
290#endif
291#endif
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.
The ROSE library.