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>
12#ifdef ROSE_HAVE_YAMLCPP
13#include <yaml-cpp/yaml.h>
17namespace BinaryAnalysis {
18namespace ModelChecker {
25class SemanticCallbacks {
28 using Ptr = SemanticCallbacksPtr;
31 const SettingsPtr mcSettings_;
34 SemanticCallbacks() =
delete;
35 explicit SemanticCallbacks(
const SettingsPtr&);
37 virtual ~SemanticCallbacks();
50 virtual void reset() {}
57 SettingsPtr mcSettings()
const;
68 virtual InstructionSemantics::BaseSemantics::SValuePtr protoval();
76 virtual InstructionSemantics::BaseSemantics::RegisterStatePtr createInitialRegisters() = 0;
84 virtual InstructionSemantics::BaseSemantics::MemoryStatePtr createInitialMemory() = 0;
93 virtual InstructionSemantics::BaseSemantics::StatePtr createInitialState();
112 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr createRiscOperators() = 0;
123 virtual InstructionSemantics::BaseSemantics::RiscOperatorsPtr
124 configureRiscOperators(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
150 virtual void attachModelCheckerSolver(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
151 const SmtSolverPtr&) {}
161 virtual void initializeState(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
169 virtual InstructionSemantics::BaseSemantics::DispatcherPtr
170 createDispatcher(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
182 virtual InstructionSemantics::BaseSemantics::SValuePtr
183 instructionPointer(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&) = 0;
188 struct CodeAddresses {
189 InstructionSemantics::BaseSemantics::SValuePtr ip;
190 std::set<Address> addresses;
191 bool isComplete =
true;
200 virtual CodeAddresses nextCodeAddresses(
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
224 virtual std::pair<bool, const char*> skipExecution(
const PathPtr&);
236 virtual std::vector<TagPtr> preExecute(
const PathNodePtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
248 virtual std::vector<TagPtr> postExecute(
const PathNodePtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&);
252 ExecutionUnitPtr unit;
253 SymbolicExpression::Ptr assertion;
254 SmtSolver::Evidence evidence;
272 virtual std::vector<NextUnit>
273 nextUnits(
const PathPtr&,
const InstructionSemantics::BaseSemantics::RiscOperatorsPtr&,
const SmtSolverPtr&) = 0;
289#ifdef ROSE_HAVE_YAMLCPP
290 virtual std::list<ExecutionUnitPtr>
291 parsePath(
const YAML::Node&,
const std::string &sourceName) = 0;
293 virtual std::list<ExecutionUnitPtr>
294 parsePath(
const Yaml::Node&,
const std::string &sourceName) = 0;
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
std::shared_ptr< SmtSolver > SmtSolverPtr
Reference counting pointer.