1
1
package soot .toolkits .scalar ;
2
2
3
+ import java .util .HashMap ;
4
+ import java .util .HashSet ;
3
5
import java .util .Iterator ;
4
6
import java .util .Map ;
7
+ import java .util .Map .Entry ;
8
+ import java .util .Set ;
5
9
6
10
import soot .G ;
7
11
import soot .Scene ;
13
17
import soot .jimple .AssignStmt ;
14
18
import soot .jimple .Constant ;
15
19
import soot .jimple .DoubleConstant ;
20
+ import soot .jimple .FieldRef ;
16
21
import soot .jimple .FloatConstant ;
17
22
import soot .jimple .IntConstant ;
18
23
import soot .jimple .LongConstant ;
@@ -61,6 +66,12 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
61
66
if (smInit == null )
62
67
return ;
63
68
69
+ Set <SootField > nonConstantFields = new HashSet <SootField >();
70
+ Map <SootField , ConstantValueTag > newTags = new HashMap <SootField , ConstantValueTag >();
71
+
72
+ if (smInit .toString ().equals ("<com.fasterxml.jackson.core.io.NumberOutput: void <clinit>()>" ))
73
+ System .out .println ("x" );
74
+
64
75
for (Iterator <Unit > itU = smInit .getActiveBody ().getUnits ().snapshotIterator ();
65
76
itU .hasNext (); ) {
66
77
Unit u = itU .next ();
@@ -69,6 +80,9 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
69
80
if (assign .getLeftOp () instanceof StaticFieldRef
70
81
&& assign .getRightOp () instanceof Constant ) {
71
82
SootField field = ((StaticFieldRef ) assign .getLeftOp ()).getField ();
83
+ if (nonConstantFields .contains (field ))
84
+ continue ;
85
+
72
86
if (field .getDeclaringClass ().equals (sc )
73
87
&& field .isStatic ()
74
88
&& field .isFinal ()) {
@@ -89,22 +103,45 @@ public void transformClass(SootClass sc, boolean removeAssignments) {
89
103
}
90
104
}
91
105
92
- // If we don't already have a value, we assign a new one
93
106
if (!found ) {
94
- Tag newTag = createConstantTagFromValue ((Constant ) assign .getRightOp ());
95
- if (newTag != null ) {
96
- field .addTag (newTag );
97
- if (removeAssignments )
98
- itU .remove ();
107
+ // If we already have a different tag for this field,
108
+ // the value is not constant and we do not associate the
109
+ // tags.
110
+ if (!checkConstantValue (newTags .get (field ), (Constant ) assign .getRightOp ())) {
111
+ nonConstantFields .add (field );
112
+ newTags .remove (field );
113
+ continue ;
99
114
}
115
+
116
+ ConstantValueTag newTag = createConstantTagFromValue ((Constant ) assign .getRightOp ());
117
+ if (newTag != null )
118
+ newTags .put (field , newTag );
100
119
}
101
120
}
102
121
}
103
122
}
104
123
}
124
+
125
+ // Do the actual assignment
126
+ for (Entry <SootField , ConstantValueTag > entry : newTags .entrySet ()) {
127
+ SootField field = entry .getKey ();
128
+ field .addTag (entry .getValue ());
129
+ }
130
+
131
+ if (removeAssignments && !newTags .isEmpty ())
132
+ for (Iterator <Unit > itU = smInit .getActiveBody ().getUnits ().snapshotIterator ();
133
+ itU .hasNext (); ) {
134
+ Unit u = itU .next ();
135
+ if (u instanceof AssignStmt ) {
136
+ AssignStmt assign = (AssignStmt ) u ;
137
+ if (assign .getLeftOp () instanceof FieldRef )
138
+ if (newTags .containsKey (((FieldRef ) assign .getLeftOp ()).getField ()))
139
+ itU .remove ();
140
+ }
141
+ }
105
142
}
106
143
107
- private Tag createConstantTagFromValue (Constant rightOp ) {
144
+ private ConstantValueTag createConstantTagFromValue (Constant rightOp ) {
108
145
if (rightOp instanceof DoubleConstant )
109
146
return new DoubleConstantValueTag (((DoubleConstant ) rightOp ).value );
110
147
else if (rightOp instanceof FloatConstant )
@@ -120,6 +157,9 @@ else if (rightOp instanceof StringConstant)
120
157
}
121
158
122
159
private boolean checkConstantValue (ConstantValueTag t , Constant rightOp ) {
160
+ if (t == null || rightOp == null )
161
+ return true ;
162
+
123
163
if (t instanceof DoubleConstantValueTag ) {
124
164
if (!(rightOp instanceof DoubleConstant ))
125
165
return false ;
0 commit comments