ROSE  0.11.145.0
SharedMemory.h
1 #ifndef ROSE_BinaryAnalysis_Concolic_SharedMemory_H
2 #define ROSE_BinaryAnalysis_Concolic_SharedMemory_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_CONCOLIC_TESTING
5 
6 #include <Rose/BinaryAnalysis/Concolic/BasicTypes.h>
7 #include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics/BasicTypes.h>
8 #include <Rose/BinaryAnalysis/SymbolicExpression.h>
9 #include <Rose/Yaml.h>
10 
11 #include <Sawyer/Optional.h>
12 #include <Sawyer/SharedObject.h>
13 
14 namespace Rose {
15 namespace BinaryAnalysis {
16 namespace Concolic {
17 
19 // Shared memory context for callbacks
21 
25 class SharedMemoryContext {
26 public:
27  SharedMemoryContext() = delete;
28 
30  SharedMemoryContext(const ArchitecturePtr&, const ExecutionEventPtr &sharedMemoryEvent);
31 
33  SharedMemoryContext(const ArchitecturePtr&, const Emulation::RiscOperatorsPtr&,
34  const ExecutionEventPtr &sharedMemoryEvent);
35 
37  SharedMemoryContext(const ArchitecturePtr&, const Emulation::RiscOperatorsPtr&, rose_addr_t accessingInstructionVa,
38  rose_addr_t accessedVa, const SymbolicExpression::Ptr &value);
39 
40  virtual ~SharedMemoryContext();
41 
42  /*------------------------------------------------------------------------------------------------------------
43  * Inputs to the callback
44  *------------------------------------------------------------------------------------------------------------*/
45 
52  ConcolicPhase phase = ConcolicPhase::EMULATION;
53 
55  ArchitecturePtr architecture;
56 
60  Emulation::RiscOperatorsPtr ops;
61 
63  rose_addr_t ip = 0;
64 
66  AddressInterval accessedVas;
67 
69  IoDirection direction = IoDirection::READ;
70 
74  ExecutionEventPtr sharedMemoryEvent;
75 
83  SymbolicExpression::Ptr valueRead;
84 
88  SymbolicExpression::Ptr valueWritten;
89 };
90 
92 // Callbacks to handle shared memory operations.
94 
96 class SharedMemoryCallback: public Sawyer::SharedObject {
97 public:
99  using Ptr = SharedMemoryCallbackPtr;
100 
101 private:
102  AddressInterval registrationVas_; // where in memory this callback was initially registered
103  std::string name_; // name of the callback in registrations and debugging
104 
105 public:
106  virtual ~SharedMemoryCallback();
107 protected:
108  SharedMemoryCallback(const std::string &name); // for factories
109  SharedMemoryCallback(const AddressInterval&, const std::string &name);
110 
111 public:
113  static void registerFactory(const Ptr &factory);
114 
119  static bool deregisterFactory(const Ptr &factory);
120 
125  static std::vector<Ptr> registeredFactories();
126 
132  static Ptr forge(const AddressInterval &where, const Yaml::Node &config);
133 
135  virtual bool matchFactory(const Yaml::Node &config) const;
136 
141  virtual Ptr instanceFromFactory(const AddressInterval &where, const Yaml::Node &config) const;
142 
144  bool isFactory() const;
145 
146 public:
150  const std::string& name() const;
151  void name(const std::string&);
162  const AddressInterval& registrationVas() const;
163  void registrationVas(const AddressInterval&);
167  void hello(const SharedMemoryContext&) const;
168 
174  virtual void playback(SharedMemoryContext&) = 0;
175 
194  virtual void handlePreSharedMemory(SharedMemoryContext&) = 0;
195  virtual void handlePostSharedMemory(const SharedMemoryContext&) {}
203  void normalRead(SharedMemoryContext&) const;
204 
209  void notAnInput(SharedMemoryContext&) const;
210 
217  void returns(SharedMemoryContext&, const SymbolicExpression::Ptr&) const;
218  void returns(SharedMemoryContext&, const InstructionSemantics::BaseSemantics::SValuePtr&) const;
226  SymbolicExpressionPtr inputVariable(const SharedMemoryContext&) const;
227 
228 
229  virtual bool operator()(bool handled, SharedMemoryContext&) final;
230 };
231 
232 } // namespace
233 } // namespace
234 } // namespace
235 
236 #endif
237 #endif
const char * IoDirection(int64_t)
Convert Rose::BinaryAnalysis::Concolic::IoDirection enum constant to a string.
Main namespace for the ROSE library.
std::vector< BasePtr > registeredFactories()
Returns all registered disassembler factories.
const char * ConcolicPhase(int64_t)
Convert Rose::BinaryAnalysis::Concolic::ConcolicPhase enum constant to a string.
bool deregisterFactory(const BasePtr &)
Remove a disassembler factory from the registry.
const char * direction(int64_t)
Convert CGFunction::iterator::direction enum constant to a string.
Sawyer::SharedPointer< SValue > SValuePtr
Shared-ownership pointer to a semantic value in any domain.
Base class for reference counted objects.
Definition: SharedObject.h:64
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.
void registerFactory(const BasePtr &)
Append a disassembler factory to the registry.