ROSE  0.11.145.0
Analysis.h
1 #ifndef ROSE_BinaryAnalysis_ByteCode_Analysis_H
2 #define ROSE_BinaryAnalysis_ByteCode_Analysis_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
5 
6 #include <Rose/BinaryAnalysis/Disassembler/BasicTypes.h>
7 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
8 
9 namespace Rose {
10 namespace BinaryAnalysis {
11 namespace ByteCode {
12 
13 using BasicBlockPtr = Partitioner2::BasicBlockPtr;
14 using PartitionerPtr = Partitioner2::PartitionerPtr;
15 
16 // Forward reference for Method
17 class Class;
18 
19 class Code {
20 public:
21  virtual const uint8_t* bytes() const = 0;
22  virtual const size_t size() const = 0;
23  virtual const rose_addr_t offset() const = 0;
24 
25 protected:
26  Code() {}
27 };
28 
29 class Field {
30 public:
31  virtual const std::string name() const = 0;
32 protected:
33  Field() {}
34 };
35 
36 class Method {
37 public:
38  virtual const std::string name() const = 0;
39  virtual const Code & code() const = 0;
40  virtual const void decode(const Disassembler::BasePtr&) const = 0;
41  virtual const SgAsmInstructionList* instructions() const = 0;
42 
43  /* Annotate the AST (.e.g., add comments to instructions) */
44  virtual void annotate() = 0;
45 
46  /* Set of instruction branch targets */
47  std::set<rose_addr_t> targets() const;
48 
49  // Methods associated with basic blocks (Rose::BinaryAnalysis::Partitioner2)
50  //
51  const std::vector<BasicBlockPtr>& blocks() const;
52  void append(BasicBlockPtr bb);
53 
54  Method() = delete;
55 
56 protected:
57  Method(rose_addr_t);
58  ~Method();
59  rose_addr_t classAddr_;
60  Partitioner2::FunctionPtr function_;
61  std::vector<BasicBlockPtr> blocks_;
62 };
63 
64 class Interface {
65 public:
66  virtual const std::string name() const = 0;
67 protected:
68  Interface() {}
69 };
70 
71 class Attribute {
72 public:
73  virtual const std::string name() const = 0;
74 protected:
75  Attribute() {}
76 };
77 
78 class Class {
79 public:
80  virtual const std::string name() const = 0;
81  virtual const std::string super_name() const = 0;
82  virtual const std::vector<const Field*> &fields() const = 0;
83  virtual const std::vector<const Method*> &methods() const = 0;
84  virtual const std::vector<const Attribute*> &attributes() const = 0;
85  virtual const std::vector<const Interface*> &interfaces() const = 0;
86  virtual const std::vector<std::string> &strings() = 0;
87  virtual void partition(const PartitionerPtr &, std::map<std::string,rose_addr_t> &) const;
88  virtual void digraph() const;
89  virtual void dump() = 0;
90 
91  rose_addr_t address() const {return address_;}
92 
93  Class() = delete;
94 
95 protected:
96  rose_addr_t address_;
97  Class(rose_addr_t va) : address_{va} {}
98 };
99 
100 class Namespace {
101 public:
102  virtual const std::string name() const = 0;
103  virtual const std::vector<const Class*> &classes() const = 0;
104  virtual void partition(const PartitionerPtr &partitioner) const;
105 
106 protected:
107  Namespace() {}
108 };
109 
110 class Container {
111 public:
112  virtual const std::string name() const = 0;
113  virtual const std::vector<const Namespace*> &namespaces() const = 0;
114  virtual void partition(const PartitionerPtr &partitioner) const;
115 
116 protected:
117  Container() {}
118 };
119 
120 } // namespace
121 } // namespace
122 } // namespace
123 
124 #endif
125 #endif
Main namespace for the ROSE library.
Sawyer::SharedPointer< BasicBlock > BasicBlockPtr
Shared-ownersip pointer for BasicBlock.
Sawyer::SharedPointer< Partitioner > PartitionerPtr
Shared-ownership pointer for Partitioner.
List of SgAsmInstruction nodes.