reverse engineering of object oriented code
TRANSCRIPT
-
8/13/2019 Reverse Engineering of Object Oriented Code
1/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
2/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
3/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
4/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
5/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
6/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
7/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
8/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
9/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
10/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
11/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
12/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
13/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
14/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
15/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
16/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
17/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
18/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
19/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
20/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
21/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
22/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
23/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
24/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
25/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
26/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
27/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
28/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
29/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
30/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
31/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
32/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
33/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
34/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
35/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
36/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
37/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
38/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
39/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
40/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
41/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
42/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
43/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
44/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
45/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
46/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
47/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
48/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
49/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
50/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
51/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
52/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
53/223
2.6 The eLibProgram 39
-
8/13/2019 Reverse Engineering of Object Oriented Code
54/223
40 2 The Object Flow Graph
and the allocation s left hand side variable,Library.borrowDocument.loan
-
8/13/2019 Reverse Engineering of Object Oriented Code
55/223
, y
(Fig. 2.8 center, edge labeled 60).
An example of a method call with a return value is provided by the first
abstract statement (after the declaration) of methodLibrary. addLoan (see
Fig. 2.7 top, line 42). The left hand side location(Library.addLoan.user)
is the target of an edge outgoing from Loan.getUser.return, the location
associated with the value returned by the method call (see Fig. 2.8 bottom,
edge labeled 42).
Container operations are also responsible for some edges in the OFG of
Fig. 2.8. For example, the body ofUser.addLoan contains just an insertion
statement (line 315). The containerUser.loans, into which aLoan object
is inserted, becomes the target of an edge starting at the inserted object
location, User .addLoan. loan(Fig. 2.8 center, edge labeled 44). This indicates
an object flow from the parameter loanof method addLoaninto the container
User .loans.
The OFG constructed for the code in Fig. 2.6 and 2.7 shows the data
flows through which objects are propagated from location to location. Thus,the parameter userof method borrowDocumentbecomes the current object
(this) inside numberOfLoans,while it is the parameter userinside method
authorizedLoan and it is the parameterusr inside the constructor of class
Loan, as depicted at the top of Fig 2.8. Similarly, the other parameter of
borrowDocument, doc,flows intoisAvailableandauthorizedLoanasthis,
and into the constructor of classLoanas the parameter doc. The object of class
Document returned by Loan.getDocument (bottom-right of Fig. 2.8) flows intothe local variabledocofLibrary. addLoan,and then becomes the current
object (this) insideDocument. addLoan.
2.7 Related Work
The OFG and the related flow propagation algorithms are based on research
conducted on pointer analysis [3, 21, 47, 49, 60, 68, 81, 86]. The aim of pointer
analysis is to obtain a static approximation of any points-to relationship that
may hold at run-time between pointers and program locations. Similarly, when
2.7 Related Work 41
be distinguished by statement or invocation context. Flow/context sensitive
-
8/13/2019 Reverse Engineering of Object Oriented Code
56/223
g y
analyses are defined with reference to the control flow graph [2] of a program,
while flow/context insensitive algorithms define the analysis semantics at the
statement level.The algorithm most similar to ours is [3]. Originally described for the C
language, it has been recently extended to Java [49, 68]. Differently from the
approach followed in this book, no explicit data structure, such as the OFG,
is used in [3] as a support for the flow propagation: data flows are represented
as set-inclusion constraints.
The improvement of a control flow insensitive pointer analysis obtained
by introducing object sensitivity was proposed in [57], where the possibility
of parameterizing the degree of object sensitivity is also discussed.
-
8/13/2019 Reverse Engineering of Object Oriented Code
57/223
This page intentionally left blank
3
-
8/13/2019 Reverse Engineering of Object Oriented Code
58/223
Class Diagram
The class diagram is the most important and most widely used description of
an Object Oriented system. It shows the static structure of the core classes
that are used to build a system. The most relevant features (attributes and
methods) of each class are provided in the class diagram, together with the
optional indication of some of their properties (visibility, type, etc.) . Moreover,
the class diagram shows the relationships that hold among the classes in a
system. This gives a static view of the structural connections that have been
designed to allow communication and interaction among the classes. Thus, the
class diagram provides a very informative summary of many design decisions
about the system s organization.
Recovery of the class diagram from the source code is a difficult task. The
decision about what elements to show/hide profoundly affects the usabilityof the diagram. Moreover, interclass relationships carry semantic information
that cannot be inferred just from the analysis of the code, being strongly
dependent on the domain knowledge and on the design rationale.
A basic algorithm for the recovery of the class diagram can be obtained
by a purely syntactic analysis of the source code, provided that a precise defi-
nition of the interclass relationships is given. For example, an association can
be inferred when a class attribute stores a reference to another class. Oneproblem of the basic algorithm for the recovery of the class diagram is that
declared types are an approximation of the classes actually instantiated in a
program, due to inheritance and interfaces. An OFG based algorithm can be
d fi d t i th f th l di t t d f th d
44 3 Class Diagram
terfaces is discussed in Section 3.2, where an algorithm is provided to improveh l f l i l i Th bl l d h
-
8/13/2019 Reverse Engineering of Object Oriented Code
59/223
the results of a purely syntactic analysis. The problems related to the usageof weakly typed containers and an OFG based algorithm to address them are
described in Section 3.3. Recovery of the class diagram is conducted on theeLibapplication in Section 3.4. Related works are discussed in the last sectionof this chapter.
3.1 Class Diagram Recovery
The elements displayed in a class diagram are the classes in the system underanalysis. Internal class features, such as attributes and methods, can be alsodisplayed. Properties of the displayed features, as, for example, the type ofattributes, the parameters of methods, their visibility and scope (object vs.class scope), can be indicated as well. This information can be directly ob-tained by analyzing the syntax of the source code. Available tools for Object
Oriented design typically offer a facility for the recovery of class diagramsfrom the code, which include this kind of syntactic information.
eLib example
3.1 Class Diagram Recovery 45
erations are in the bottom compartment. The first entry is the constructor,hil h h h d id h d f i li i f hi l
-
8/13/2019 Reverse Engineering of Object Oriented Code
60/223
while the other methods provide the exported functionalities of this class.
Relationships among classes are used to indicate either the presence of ab-straction mechanisms or the possibility of accessing features of another class.Generalization and realization relationships are examples of abstraction mech-anisms commonly used in Object Oriented programming that can be shownin a class diagram. Aggregation, association and dependency relationships are
displayed in a class diagram to indicate that a class has access to resources(attributes or operations) from another class.Ageneralizationrelationship connects two classes when one inherits fea-
tures (attributes and methods) from the other. The subclass can add furtherfeatures and can redefine inherited methods (overriding). Arealizationrela-tionship connects a class to an interface if the class implements all methodsdeclared in the interface. Users of this class are ensured that the operations
in the realized interface are actually available.Generalization and realization relationships satisfy the substitutability
principle: in every place in the program where a location of the super-class/interface type is declared and used, an instance of any sublass/class
realizing the interface can actually occur.
Relationships of access kind hold between pairs of classes each time oneclass possesses a way to reference the other. Conceptually, access relationships
can be categorized by relative strength. A quite strong relationship is theaggregation. A class is related to another class by an aggregation relationship
if the latter is a part-of the former. This means that the existence of anobject of the first class requires that one or more objects of the other classdo also exist, in that they are an integral part of the first object. Participants
in aggregation relationships may have their own independent life, but it is
not possible to conceive the whole (first class) without adding also the parts
(second class). An even stronger relationships is thecomposition.It is a formof aggregation in which the parts and the whole have the same lifetime, inthat the parts, possibly created later, can not survive after the death of thewhole.
46 3 Class Diagram
the dependency) might affect the dependent class. The typical case is a classthat uses resources from another class (e g invoking one of its methods) Of
-
8/13/2019 Reverse Engineering of Object Oriented Code
61/223
that uses resources from another class (e.g., invoking one of its methods). Ofcourse, aggregation and association are subsumed by dependency.
3.1.1 Recovery of the inter-class relationships
From the implementation point of view, there is no substantial differencebetween aggregation and association. Both relationships are typically imple-mented as a class att ribute referencing other objects. Attributes of container
type are used whenever the multiplicity of the target objects is greater thanone. In principle, there would be the possibility to approximately distinguishbetween composition and aggregation, by analyzing the life time of the ref-erenced objects. However, in practice implementations of the two relationvariants have a large overlap.
In the implementation, dependencies that are not associations or aggre-gations can be distinguished from the latter ones because they are accesses
to features of another class performed through program locations that, dif-ferently from class attributes, are less stable. For example, a local variableor a method parameter may be used to access an object of another class andinvoke one of its methods. In such cases, the reference to the accessed object isnot stable, being stored in a temporary variable. Nevertheless, any change inthe target class potentially affects the user class, thus there is a dependency.
-
8/13/2019 Reverse Engineering of Object Oriented Code
62/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
63/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
64/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
65/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
66/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
67/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
68/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
69/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
70/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
71/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
72/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
73/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
74/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
75/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
76/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
77/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
78/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
79/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
80/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
81/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
82/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
83/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
84/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
85/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
86/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
87/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
88/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
89/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
90/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
91/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
92/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
93/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
94/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
95/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
96/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
97/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
98/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
99/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
100/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
101/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
102/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
103/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
104/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
105/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
106/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
107/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
108/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
109/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
110/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
111/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
112/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
113/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
114/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
115/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
116/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
117/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
118/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
119/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
120/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
121/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
122/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
123/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
124/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
125/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
126/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
127/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
128/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
129/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
130/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
131/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
132/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
133/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
134/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
135/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
136/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
137/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
138/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
139/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
140/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
141/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
142/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
143/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
144/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
145/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
146/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
147/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
148/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
149/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
150/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
151/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
152/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
153/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
154/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
155/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
156/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
157/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
158/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
159/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
160/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
161/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
162/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
163/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
164/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
165/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
166/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
167/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
168/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
169/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
170/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
171/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
172/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
173/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
174/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
175/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
176/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
177/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
178/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
179/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
180/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
181/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
182/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
183/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
184/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
185/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
186/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
187/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
188/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
189/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
190/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
191/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
192/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
193/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
194/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
195/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
196/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
197/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
198/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
199/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
200/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
201/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
202/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
203/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
204/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
205/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
206/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
207/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
208/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
209/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
210/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
211/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
212/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
213/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
214/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
215/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
216/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
217/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
218/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
219/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
220/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
221/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
222/223
-
8/13/2019 Reverse Engineering of Object Oriented Code
223/223