1#ifndef ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H
2#define ROSE_BinaryAnalysis_ModelChecker_SemanticCallbacks_H
3#include <featureTests.h>
4#ifdef ROSE_ENABLE_MODEL_CHECKER
6#include <Rose/BinaryAnalysis/ModelChecker/BasicTypes.h>
8#include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h>
9#include <Rose/BinaryAnalysis/SmtSolver.h>
13namespace BinaryAnalysis {
14namespace ModelChecker {
21class SemanticCallbacks {
24 using Ptr = SemanticCallbacksPtr;
27 const SettingsPtr mcSettings_;
30 SemanticCallbacks() =
delete;
31 explicit SemanticCallbacks(
const SettingsPtr&);
33 virtual ~SemanticCallbacks();
46 virtual void reset() {}
53 SettingsPtr mcSettings()
const;
64 virtual InstructionSemantics::BaseSemantics::SValuePtr protoval();
72 virtual InstructionSemantics::BaseSemantics::RegisterStatePtr createInitialRegisters() = 0;
80 virtual InstructionSemantics::BaseSemantics::MemoryStatePtr createInitialMemory() = 0;
89 virtual InstructionSemantics::BaseSemantics::StatePtr createInitialState();
108 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr createRiscOperators() = 0;
119 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr
120 configureRiscOperators(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
146 virtual void attachModelCheckerSolver(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
147 const SmtSolverPtr&) {}
157 virtual void initializeState(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
165 virtual InstructionSemantics::BaseSemantics::DispatcherPtr
166 createDispatcher(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
178 virtual InstructionSemantics::BaseSemantics::SValuePtr
179 instructionPointer(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
184 struct CodeAddresses {
185 InstructionSemantics::BaseSemantics::SValuePtr ip;
186 std::set<Address> addresses;
187 bool isComplete =
true;
196 virtual CodeAddresses nextCodeAddresses(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
220 virtual std::pair<bool, const char*> skipExecution(
const PathPtr&);
232 virtual std::vector<TagPtr> preExecute(
const PathNodePtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
244 virtual std::vector<TagPtr> postExecute(
const PathNodePtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
248 ExecutionUnitPtr unit;
249 SymbolicExpression::Ptr assertion;
250 SmtSolver::Evidence evidence;
268 virtual std::vector<NextUnit>
269 nextUnits(
const PathPtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
const SmtSolverPtr&) = 0;
283 virtual std::list<ExecutionUnitPtr> parsePath(
const Yaml::Node&,
const std::string &sourceName) = 0;
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.