1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.bcel.verifier;
20
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25
26 import org.apache.bcel.classfile.JavaClass;
27 import org.apache.bcel.classfile.Utility;
28 import org.apache.bcel.verifier.statics.Pass1Verifier;
29 import org.apache.bcel.verifier.statics.Pass2Verifier;
30 import org.apache.bcel.verifier.statics.Pass3aVerifier;
31 import org.apache.bcel.verifier.structurals.Pass3bVerifier;
32 import org.apache.commons.lang3.ArrayUtils;
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class Verifier {
47
48 static final String NAME = "Apache Commons BCEL";
49 static final String BANNER = NAME + "\nhttps://commons.apache.org/bcel\n";
50
51 static final Verifier[] EMPTY_ARRAY = {};
52
53
54
55
56
57
58
59
60
61 public static void main(final String[] args) {
62 System.out.println(BANNER);
63 for (int index = 0; index < args.length; index++) {
64 try {
65 if (args[index].endsWith(JavaClass.EXTENSION)) {
66 final int dotclasspos = args[index].lastIndexOf(JavaClass.EXTENSION);
67 if (dotclasspos != -1) {
68 args[index] = args[index].substring(0, dotclasspos);
69 }
70 }
71 args[index] = Utility.pathToPackage(args[index]);
72 System.out.println("Now verifying: " + args[index] + "\n");
73 verifyType(args[index]);
74 org.apache.bcel.Repository.clearCache();
75 System.gc();
76 } catch (final ClassNotFoundException e) {
77 e.printStackTrace();
78 }
79 }
80 }
81
82 static void verifyType(final String fullyQualifiedClassName) throws ClassNotFoundException {
83 final Verifier verifier = VerifierFactory.getVerifier(fullyQualifiedClassName);
84 VerificationResult verificationResult;
85 verificationResult = verifier.doPass1();
86 System.out.println("Pass 1:\n" + verificationResult);
87 verificationResult = verifier.doPass2();
88 System.out.println("Pass 2:\n" + verificationResult);
89 if (verificationResult == VerificationResult.VR_OK) {
90 final JavaClass jc = org.apache.bcel.Repository.lookupClass(fullyQualifiedClassName);
91 for (int i = 0; i < jc.getMethods().length; i++) {
92 verificationResult = verifier.doPass3a(i);
93 System.out.println("Pass 3a, method number " + i + " ['" + jc.getMethods()[i] + "']:\n" + verificationResult);
94 verificationResult = verifier.doPass3b(i);
95 System.out.println("Pass 3b, method number " + i + " ['" + jc.getMethods()[i] + "']:\n" + verificationResult);
96 }
97 }
98 System.out.println("Warnings:");
99 final String[] warnings = verifier.getMessages();
100 if (warnings.length == 0) {
101 System.out.println("<none>");
102 }
103 for (final String warning : warnings) {
104 System.out.println(warning);
105 }
106 System.out.println("\n");
107
108 verifier.flush();
109 }
110
111
112
113
114 private final String className;
115
116
117 private Pass1Verifier p1v;
118
119
120 private Pass2Verifier p2v;
121
122
123 private final Map<String, Pass3aVerifier> p3avs = new HashMap<>();
124
125
126 private final Map<String, Pass3bVerifier> p3bvs = new HashMap<>();
127
128
129
130
131
132
133 Verifier(final String fullyQualifiedClassName) {
134 className = fullyQualifiedClassName;
135 }
136
137
138
139
140
141
142 public VerificationResult doPass1() {
143 if (p1v == null) {
144 p1v = new Pass1Verifier(this);
145 }
146 return p1v.verify();
147 }
148
149
150
151
152
153
154 public VerificationResult doPass2() {
155 if (p2v == null) {
156 p2v = new Pass2Verifier(this);
157 }
158 return p2v.verify();
159 }
160
161
162
163
164
165
166
167 public VerificationResult doPass3a(final int methodNo) {
168 return p3avs.computeIfAbsent(Integer.toString(methodNo), k -> new Pass3aVerifier(this, methodNo)).verify();
169 }
170
171
172
173
174
175
176
177 public VerificationResult doPass3b(final int methodNo) {
178 return p3bvs.computeIfAbsent(Integer.toString(methodNo), k -> new Pass3bVerifier(this, methodNo)).verify();
179 }
180
181
182
183
184
185 public void flush() {
186 p1v = null;
187 p2v = null;
188 p3avs.clear();
189 p3bvs.clear();
190 }
191
192
193
194
195
196
197
198
199
200 public final String getClassName() {
201 return className;
202 }
203
204
205
206
207
208
209
210
211 public String[] getMessages() throws ClassNotFoundException {
212 final List<String> messages = new ArrayList<>();
213 if (p1v != null) {
214 p1v.getMessagesList().forEach(element -> messages.add("Pass 1: " + element));
215 }
216 if (p2v != null) {
217 p2v.getMessagesList().forEach(element -> messages.add("Pass 2: " + element));
218 }
219 for (final Pass3aVerifier pv : p3avs.values()) {
220 final int meth = pv.getMethodNo();
221 for (final String element : pv.getMessages()) {
222 messages.add("Pass 3a, method " + meth + " ('" + org.apache.bcel.Repository.lookupClass(className).getMethods()[meth] + "'): " + element);
223 }
224 }
225 for (final Pass3bVerifier pv : p3bvs.values()) {
226 final int meth = pv.getMethodNo();
227 for (final String element : pv.getMessages()) {
228 messages.add("Pass 3b, method " + meth + " ('" + org.apache.bcel.Repository.lookupClass(className).getMethods()[meth] + "'): " + element);
229 }
230 }
231
232 return messages.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
233 }
234 }