1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.bcel.verifier.structurals;
18
19
20 import org.apache.bcel.Constants;
21 import org.apache.bcel.classfile.Constant;
22 import org.apache.bcel.classfile.ConstantDouble;
23 import org.apache.bcel.classfile.ConstantFloat;
24 import org.apache.bcel.classfile.ConstantInteger;
25 import org.apache.bcel.classfile.ConstantLong;
26 import org.apache.bcel.classfile.ConstantString;
27 import org.apache.bcel.generic.*;
28
29 /***
30 * This Visitor class may be used for a type-based Java Virtual Machine
31 * simulation.
32 * It does not check for correct types on the OperandStack or in the
33 * LocalVariables; nor does it check their sizes are sufficiently big.
34 * Thus, to use this Visitor for bytecode verifying, you have to make sure
35 * externally that the type constraints of the Java Virtual Machine instructions
36 * are satisfied. An InstConstraintVisitor may be used for this.
37 * Anyway, this Visitor does not mandate it. For example, when you
38 * visitIADD(IADD o), then there are two stack slots popped and one
39 * stack slot containing a Type.INT is pushed (where you could also
40 * pop only one slot if you know there are two Type.INT on top of the
41 * stack). Monitor-specific behaviour is not simulated.
42 *
43 * </P><B>Conventions:</B>
44 *
45 * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG
46 * that would normally take up two stack slots (like Double_HIGH and
47 * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG
48 * object on the stack here.
49 * If a two-slot type is stored into a local variable, the next variable
50 * is given the type Type.UNKNOWN.
51 *
52 * @version $Id: ExecutionVisitor.java 386056 2006-03-15 11:31:56Z tcurdt $
53 * @author Enver Haase
54 * @see #visitDSTORE(DSTORE o)
55 * @see InstConstraintVisitor
56 */
57 public class ExecutionVisitor extends EmptyVisitor implements Visitor{
58
59 /***
60 * The executionframe we're operating on.
61 */
62 private Frame frame = null;
63
64 /***
65 * The ConstantPoolGen we're working with.
66 * @see #setConstantPoolGen(ConstantPoolGen)
67 */
68 private ConstantPoolGen cpg = null;
69
70 /***
71 * Constructor. Constructs a new instance of this class.
72 */
73 public ExecutionVisitor(){}
74
75 /***
76 * The OperandStack from the current Frame we're operating on.
77 * @see #setFrame(Frame)
78 */
79 private OperandStack stack(){
80 return frame.getStack();
81 }
82
83 /***
84 * The LocalVariables from the current Frame we're operating on.
85 * @see #setFrame(Frame)
86 */
87 private LocalVariables locals(){
88 return frame.getLocals();
89 }
90
91 /***
92 * Sets the ConstantPoolGen needed for symbolic execution.
93 */
94 public void setConstantPoolGen(ConstantPoolGen cpg){
95 this.cpg = cpg;
96 }
97
98 /***
99 * The only method granting access to the single instance of
100 * the ExecutionVisitor class. Before actively using this
101 * instance, <B>SET THE ConstantPoolGen FIRST</B>.
102 * @see #setConstantPoolGen(ConstantPoolGen)
103 */
104 public void setFrame(Frame f){
105 this.frame = f;
106 }
107
108 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
109
110
111
112
113
114
115
116
117
118 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
119 public void visitAALOAD(AALOAD o){
120 stack().pop();
121
122 Type t = stack().pop();
123 if (t == Type.NULL){
124 stack().push(Type.NULL);
125 }
126 else{
127 ArrayType at = (ArrayType) t;
128 stack().push(at.getElementType());
129 }
130 }
131 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
132 public void visitAASTORE(AASTORE o){
133 stack().pop();
134 stack().pop();
135 stack().pop();
136 }
137 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
138 public void visitACONST_NULL(ACONST_NULL o){
139 stack().push(Type.NULL);
140 }
141 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
142 public void visitALOAD(ALOAD o){
143 stack().push(locals().get(o.getIndex()));
144 }
145 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
146 public void visitANEWARRAY(ANEWARRAY o){
147 stack().pop();
148 stack().push( new ArrayType(o.getType(cpg), 1) );
149 }
150 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
151 public void visitARETURN(ARETURN o){
152 stack().pop();
153 }
154 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
155 public void visitARRAYLENGTH(ARRAYLENGTH o){
156 stack().pop();
157 stack().push(Type.INT);
158 }
159
160 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
161 public void visitASTORE(ASTORE o){
162 locals().set(o.getIndex(), stack().pop());
163
164 }
165
166 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
167 public void visitATHROW(ATHROW o){
168 Type t = stack().pop();
169 stack().clear();
170 if (t.equals(Type.NULL)) {
171 stack().push(Type.getType("Ljava/lang/NullPointerException;"));
172 } else {
173 stack().push(t);
174 }
175 }
176
177 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
178 public void visitBALOAD(BALOAD o){
179 stack().pop();
180 stack().pop();
181 stack().push(Type.INT);
182 }
183
184 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
185 public void visitBASTORE(BASTORE o){
186 stack().pop();
187 stack().pop();
188 stack().pop();
189 }
190
191 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
192 public void visitBIPUSH(BIPUSH o){
193 stack().push(Type.INT);
194 }
195
196 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
197 public void visitCALOAD(CALOAD o){
198 stack().pop();
199 stack().pop();
200 stack().push(Type.INT);
201 }
202 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
203 public void visitCASTORE(CASTORE o){
204 stack().pop();
205 stack().pop();
206 stack().pop();
207 }
208 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
209 public void visitCHECKCAST(CHECKCAST o){
210
211
212
213
214
215 stack().pop();
216 stack().push(o.getType(cpg));
217 }
218
219 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
220 public void visitD2F(D2F o){
221 stack().pop();
222 stack().push(Type.FLOAT);
223 }
224 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
225 public void visitD2I(D2I o){
226 stack().pop();
227 stack().push(Type.INT);
228 }
229 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
230 public void visitD2L(D2L o){
231 stack().pop();
232 stack().push(Type.LONG);
233 }
234 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
235 public void visitDADD(DADD o){
236 stack().pop();
237 stack().pop();
238 stack().push(Type.DOUBLE);
239 }
240 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
241 public void visitDALOAD(DALOAD o){
242 stack().pop();
243 stack().pop();
244 stack().push(Type.DOUBLE);
245 }
246 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
247 public void visitDASTORE(DASTORE o){
248 stack().pop();
249 stack().pop();
250 stack().pop();
251 }
252 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
253 public void visitDCMPG(DCMPG o){
254 stack().pop();
255 stack().pop();
256 stack().push(Type.INT);
257 }
258 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
259 public void visitDCMPL(DCMPL o){
260 stack().pop();
261 stack().pop();
262 stack().push(Type.INT);
263 }
264 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
265 public void visitDCONST(DCONST o){
266 stack().push(Type.DOUBLE);
267 }
268 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
269 public void visitDDIV(DDIV o){
270 stack().pop();
271 stack().pop();
272 stack().push(Type.DOUBLE);
273 }
274 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
275 public void visitDLOAD(DLOAD o){
276 stack().push(Type.DOUBLE);
277 }
278 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
279 public void visitDMUL(DMUL o){
280 stack().pop();
281 stack().pop();
282 stack().push(Type.DOUBLE);
283 }
284 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
285 public void visitDNEG(DNEG o){
286 stack().pop();
287 stack().push(Type.DOUBLE);
288 }
289 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
290 public void visitDREM(DREM o){
291 stack().pop();
292 stack().pop();
293 stack().push(Type.DOUBLE);
294 }
295 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
296 public void visitDRETURN(DRETURN o){
297 stack().pop();
298 }
299 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
300 public void visitDSTORE(DSTORE o){
301 locals().set(o.getIndex(), stack().pop());
302 locals().set(o.getIndex()+1, Type.UNKNOWN);
303 }
304 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
305 public void visitDSUB(DSUB o){
306 stack().pop();
307 stack().pop();
308 stack().push(Type.DOUBLE);
309 }
310 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
311 public void visitDUP(DUP o){
312 Type t = stack().pop();
313 stack().push(t);
314 stack().push(t);
315 }
316 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
317 public void visitDUP_X1(DUP_X1 o){
318 Type w1 = stack().pop();
319 Type w2 = stack().pop();
320 stack().push(w1);
321 stack().push(w2);
322 stack().push(w1);
323 }
324 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
325 public void visitDUP_X2(DUP_X2 o){
326 Type w1 = stack().pop();
327 Type w2 = stack().pop();
328 if (w2.getSize() == 2){
329 stack().push(w1);
330 stack().push(w2);
331 stack().push(w1);
332 }
333 else{
334 Type w3 = stack().pop();
335 stack().push(w1);
336 stack().push(w3);
337 stack().push(w2);
338 stack().push(w1);
339 }
340 }
341 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
342 public void visitDUP2(DUP2 o){
343 Type t = stack().pop();
344 if (t.getSize() == 2){
345 stack().push(t);
346 stack().push(t);
347 }
348 else{
349 Type u = stack().pop();
350 stack().push(u);
351 stack().push(t);
352 stack().push(u);
353 stack().push(t);
354 }
355 }
356 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
357 public void visitDUP2_X1(DUP2_X1 o){
358 Type t = stack().pop();
359 if (t.getSize() == 2){
360 Type u = stack().pop();
361 stack().push(t);
362 stack().push(u);
363 stack().push(t);
364 }
365 else{
366 Type u = stack().pop();
367 Type v = stack().pop();
368 stack().push(u);
369 stack().push(t);
370 stack().push(v);
371 stack().push(u);
372 stack().push(t);
373 }
374 }
375 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
376 public void visitDUP2_X2(DUP2_X2 o){
377 Type t = stack().pop();
378 if (t.getSize() == 2){
379 Type u = stack().pop();
380 if (u.getSize() == 2){
381 stack().push(t);
382 stack().push(u);
383 stack().push(t);
384 }else{
385 Type v = stack().pop();
386 stack().push(t);
387 stack().push(v);
388 stack().push(u);
389 stack().push(t);
390 }
391 }
392 else{
393 Type u = stack().pop();
394 Type v = stack().pop();
395 if (v.getSize() == 2){
396 stack().push(u);
397 stack().push(t);
398 stack().push(v);
399 stack().push(u);
400 stack().push(t);
401 }else{
402 Type w = stack().pop();
403 stack().push(u);
404 stack().push(t);
405 stack().push(w);
406 stack().push(v);
407 stack().push(u);
408 stack().push(t);
409 }
410 }
411 }
412 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
413 public void visitF2D(F2D o){
414 stack().pop();
415 stack().push(Type.DOUBLE);
416 }
417 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
418 public void visitF2I(F2I o){
419 stack().pop();
420 stack().push(Type.INT);
421 }
422 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
423 public void visitF2L(F2L o){
424 stack().pop();
425 stack().push(Type.LONG);
426 }
427 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
428 public void visitFADD(FADD o){
429 stack().pop();
430 stack().pop();
431 stack().push(Type.FLOAT);
432 }
433 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
434 public void visitFALOAD(FALOAD o){
435 stack().pop();
436 stack().pop();
437 stack().push(Type.FLOAT);
438 }
439 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
440 public void visitFASTORE(FASTORE o){
441 stack().pop();
442 stack().pop();
443 stack().pop();
444 }
445 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
446 public void visitFCMPG(FCMPG o){
447 stack().pop();
448 stack().pop();
449 stack().push(Type.INT);
450 }
451 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
452 public void visitFCMPL(FCMPL o){
453 stack().pop();
454 stack().pop();
455 stack().push(Type.INT);
456 }
457 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
458 public void visitFCONST(FCONST o){
459 stack().push(Type.FLOAT);
460 }
461 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
462 public void visitFDIV(FDIV o){
463 stack().pop();
464 stack().pop();
465 stack().push(Type.FLOAT);
466 }
467 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
468 public void visitFLOAD(FLOAD o){
469 stack().push(Type.FLOAT);
470 }
471 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
472 public void visitFMUL(FMUL o){
473 stack().pop();
474 stack().pop();
475 stack().push(Type.FLOAT);
476 }
477 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
478 public void visitFNEG(FNEG o){
479 stack().pop();
480 stack().push(Type.FLOAT);
481 }
482 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
483 public void visitFREM(FREM o){
484 stack().pop();
485 stack().pop();
486 stack().push(Type.FLOAT);
487 }
488 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
489 public void visitFRETURN(FRETURN o){
490 stack().pop();
491 }
492 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
493 public void visitFSTORE(FSTORE o){
494 locals().set(o.getIndex(), stack().pop());
495 }
496 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
497 public void visitFSUB(FSUB o){
498 stack().pop();
499 stack().pop();
500 stack().push(Type.FLOAT);
501 }
502 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
503 public void visitGETFIELD(GETFIELD o){
504 stack().pop();
505 Type t = o.getFieldType(cpg);
506 if ( t.equals(Type.BOOLEAN) ||
507 t.equals(Type.CHAR) ||
508 t.equals(Type.BYTE) ||
509 t.equals(Type.SHORT) ) {
510 t = Type.INT;
511 }
512 stack().push(t);
513 }
514 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
515 public void visitGETSTATIC(GETSTATIC o){
516 Type t = o.getFieldType(cpg);
517 if ( t.equals(Type.BOOLEAN) ||
518 t.equals(Type.CHAR) ||
519 t.equals(Type.BYTE) ||
520 t.equals(Type.SHORT) ) {
521 t = Type.INT;
522 }
523 stack().push(t);
524 }
525 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
526 public void visitGOTO(GOTO o){
527
528 }
529 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
530 public void visitGOTO_W(GOTO_W o){
531
532 }
533 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
534 public void visitI2B(I2B o){
535 stack().pop();
536 stack().push(Type.INT);
537 }
538 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
539 public void visitI2C(I2C o){
540 stack().pop();
541 stack().push(Type.INT);
542 }
543 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
544 public void visitI2D(I2D o){
545 stack().pop();
546 stack().push(Type.DOUBLE);
547 }
548 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
549 public void visitI2F(I2F o){
550 stack().pop();
551 stack().push(Type.FLOAT);
552 }
553 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
554 public void visitI2L(I2L o){
555 stack().pop();
556 stack().push(Type.LONG);
557 }
558 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
559 public void visitI2S(I2S o){
560 stack().pop();
561 stack().push(Type.INT);
562 }
563 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
564 public void visitIADD(IADD o){
565 stack().pop();
566 stack().pop();
567 stack().push(Type.INT);
568 }
569 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
570 public void visitIALOAD(IALOAD o){
571 stack().pop();
572 stack().pop();
573 stack().push(Type.INT);
574 }
575 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
576 public void visitIAND(IAND o){
577 stack().pop();
578 stack().pop();
579 stack().push(Type.INT);
580 }
581 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
582 public void visitIASTORE(IASTORE o){
583 stack().pop();
584 stack().pop();
585 stack().pop();
586 }
587 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
588 public void visitICONST(ICONST o){
589 stack().push(Type.INT);
590 }
591 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
592 public void visitIDIV(IDIV o){
593 stack().pop();
594 stack().pop();
595 stack().push(Type.INT);
596 }
597 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
598 public void visitIF_ACMPEQ(IF_ACMPEQ o){
599 stack().pop();
600 stack().pop();
601 }
602 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
603 public void visitIF_ACMPNE(IF_ACMPNE o){
604 stack().pop();
605 stack().pop();
606 }
607 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
608 public void visitIF_ICMPEQ(IF_ICMPEQ o){
609 stack().pop();
610 stack().pop();
611 }
612 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
613 public void visitIF_ICMPGE(IF_ICMPGE o){
614 stack().pop();
615 stack().pop();
616 }
617 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
618 public void visitIF_ICMPGT(IF_ICMPGT o){
619 stack().pop();
620 stack().pop();
621 }
622 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
623 public void visitIF_ICMPLE(IF_ICMPLE o){
624 stack().pop();
625 stack().pop();
626 }
627 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
628 public void visitIF_ICMPLT(IF_ICMPLT o){
629 stack().pop();
630 stack().pop();
631 }
632 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
633 public void visitIF_ICMPNE(IF_ICMPNE o){
634 stack().pop();
635 stack().pop();
636 }
637 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
638 public void visitIFEQ(IFEQ o){
639 stack().pop();
640 }
641 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
642 public void visitIFGE(IFGE o){
643 stack().pop();
644 }
645 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
646 public void visitIFGT(IFGT o){
647 stack().pop();
648 }
649 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
650 public void visitIFLE(IFLE o){
651 stack().pop();
652 }
653 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
654 public void visitIFLT(IFLT o){
655 stack().pop();
656 }
657 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
658 public void visitIFNE(IFNE o){
659 stack().pop();
660 }
661 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
662 public void visitIFNONNULL(IFNONNULL o){
663 stack().pop();
664 }
665 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
666 public void visitIFNULL(IFNULL o){
667 stack().pop();
668 }
669 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
670 public void visitIINC(IINC o){
671
672 }
673 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
674 public void visitILOAD(ILOAD o){
675 stack().push(Type.INT);
676 }
677 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
678 public void visitIMUL(IMUL o){
679 stack().pop();
680 stack().pop();
681 stack().push(Type.INT);
682 }
683 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
684 public void visitINEG(INEG o){
685 stack().pop();
686 stack().push(Type.INT);
687 }
688 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
689 public void visitINSTANCEOF(INSTANCEOF o){
690 stack().pop();
691 stack().push(Type.INT);
692 }
693 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
694 public void visitINVOKEINTERFACE(INVOKEINTERFACE o){
695 stack().pop();
696 for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
697 stack().pop();
698 }
699
700
701
702
703 if (o.getReturnType(cpg) != Type.VOID){
704 Type t = o.getReturnType(cpg);
705 if ( t.equals(Type.BOOLEAN) ||
706 t.equals(Type.CHAR) ||
707 t.equals(Type.BYTE) ||
708 t.equals(Type.SHORT) ) {
709 t = Type.INT;
710 }
711 stack().push(t);
712 }
713 }
714 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
715 public void visitINVOKESPECIAL(INVOKESPECIAL o){
716 if (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)){
717 UninitializedObjectType t = (UninitializedObjectType) stack().peek(o.getArgumentTypes(cpg).length);
718 if (t == Frame._this){
719 Frame._this = null;
720 }
721 stack().initializeObject(t);
722 locals().initializeObject(t);
723 }
724 stack().pop();
725 for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
726 stack().pop();
727 }
728
729
730
731
732 if (o.getReturnType(cpg) != Type.VOID){
733 Type t = o.getReturnType(cpg);
734 if ( t.equals(Type.BOOLEAN) ||
735 t.equals(Type.CHAR) ||
736 t.equals(Type.BYTE) ||
737 t.equals(Type.SHORT) ) {
738 t = Type.INT;
739 }
740 stack().push(t);
741 }
742 }
743 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
744 public void visitINVOKESTATIC(INVOKESTATIC o){
745 for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
746 stack().pop();
747 }
748
749
750
751
752 if (o.getReturnType(cpg) != Type.VOID){
753 Type t = o.getReturnType(cpg);
754 if ( t.equals(Type.BOOLEAN) ||
755 t.equals(Type.CHAR) ||
756 t.equals(Type.BYTE) ||
757 t.equals(Type.SHORT) ) {
758 t = Type.INT;
759 }
760 stack().push(t);
761 }
762 }
763 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
764 public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){
765 stack().pop();
766 for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
767 stack().pop();
768 }
769
770
771
772
773 if (o.getReturnType(cpg) != Type.VOID){
774 Type t = o.getReturnType(cpg);
775 if ( t.equals(Type.BOOLEAN) ||
776 t.equals(Type.CHAR) ||
777 t.equals(Type.BYTE) ||
778 t.equals(Type.SHORT) ) {
779 t = Type.INT;
780 }
781 stack().push(t);
782 }
783 }
784 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
785 public void visitIOR(IOR o){
786 stack().pop();
787 stack().pop();
788 stack().push(Type.INT);
789 }
790 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
791 public void visitIREM(IREM o){
792 stack().pop();
793 stack().pop();
794 stack().push(Type.INT);
795 }
796 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
797 public void visitIRETURN(IRETURN o){
798 stack().pop();
799 }
800 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
801 public void visitISHL(ISHL o){
802 stack().pop();
803 stack().pop();
804 stack().push(Type.INT);
805 }
806 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
807 public void visitISHR(ISHR o){
808 stack().pop();
809 stack().pop();
810 stack().push(Type.INT);
811 }
812 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
813 public void visitISTORE(ISTORE o){
814 locals().set(o.getIndex(), stack().pop());
815 }
816 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
817 public void visitISUB(ISUB o){
818 stack().pop();
819 stack().pop();
820 stack().push(Type.INT);
821 }
822 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
823 public void visitIUSHR(IUSHR o){
824 stack().pop();
825 stack().pop();
826 stack().push(Type.INT);
827 }
828 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
829 public void visitIXOR(IXOR o){
830 stack().pop();
831 stack().pop();
832 stack().push(Type.INT);
833 }
834
835 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
836 public void visitJSR(JSR o){
837 stack().push(new ReturnaddressType(o.physicalSuccessor()));
838
839 }
840
841 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
842 public void visitJSR_W(JSR_W o){
843 stack().push(new ReturnaddressType(o.physicalSuccessor()));
844 }
845
846 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
847 public void visitL2D(L2D o){
848 stack().pop();
849 stack().push(Type.DOUBLE);
850 }
851 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
852 public void visitL2F(L2F o){
853 stack().pop();
854 stack().push(Type.FLOAT);
855 }
856 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
857 public void visitL2I(L2I o){
858 stack().pop();
859 stack().push(Type.INT);
860 }
861 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
862 public void visitLADD(LADD o){
863 stack().pop();
864 stack().pop();
865 stack().push(Type.LONG);
866 }
867 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
868 public void visitLALOAD(LALOAD o){
869 stack().pop();
870 stack().pop();
871 stack().push(Type.LONG);
872 }
873 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
874 public void visitLAND(LAND o){
875 stack().pop();
876 stack().pop();
877 stack().push(Type.LONG);
878 }
879 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
880 public void visitLASTORE(LASTORE o){
881 stack().pop();
882 stack().pop();
883 stack().pop();
884 }
885 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
886 public void visitLCMP(LCMP o){
887 stack().pop();
888 stack().pop();
889 stack().push(Type.INT);
890 }
891 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
892 public void visitLCONST(LCONST o){
893 stack().push(Type.LONG);
894 }
895 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
896 public void visitLDC(LDC o){
897 Constant c = cpg.getConstant(o.getIndex());
898 if (c instanceof ConstantInteger){
899 stack().push(Type.INT);
900 }
901 if (c instanceof ConstantFloat){
902 stack().push(Type.FLOAT);
903 }
904 if (c instanceof ConstantString){
905 stack().push(Type.STRING);
906 }
907 }
908 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
909 public void visitLDC_W(LDC_W o){
910 Constant c = cpg.getConstant(o.getIndex());
911 if (c instanceof ConstantInteger){
912 stack().push(Type.INT);
913 }
914 if (c instanceof ConstantFloat){
915 stack().push(Type.FLOAT);
916 }
917 if (c instanceof ConstantString){
918 stack().push(Type.STRING);
919 }
920 }
921 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
922 public void visitLDC2_W(LDC2_W o){
923 Constant c = cpg.getConstant(o.getIndex());
924 if (c instanceof ConstantLong){
925 stack().push(Type.LONG);
926 }
927 if (c instanceof ConstantDouble){
928 stack().push(Type.DOUBLE);
929 }
930 }
931 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
932 public void visitLDIV(LDIV o){
933 stack().pop();
934 stack().pop();
935 stack().push(Type.LONG);
936 }
937 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
938 public void visitLLOAD(LLOAD o){
939 stack().push(locals().get(o.getIndex()));
940 }
941 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
942 public void visitLMUL(LMUL o){
943 stack().pop();
944 stack().pop();
945 stack().push(Type.LONG);
946 }
947 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
948 public void visitLNEG(LNEG o){
949 stack().pop();
950 stack().push(Type.LONG);
951 }
952 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
953 public void visitLOOKUPSWITCH(LOOKUPSWITCH o){
954 stack().pop();
955 }
956 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
957 public void visitLOR(LOR o){
958 stack().pop();
959 stack().pop();
960 stack().push(Type.LONG);
961 }
962 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
963 public void visitLREM(LREM o){
964 stack().pop();
965 stack().pop();
966 stack().push(Type.LONG);
967 }
968 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
969 public void visitLRETURN(LRETURN o){
970 stack().pop();
971 }
972 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
973 public void visitLSHL(LSHL o){
974 stack().pop();
975 stack().pop();
976 stack().push(Type.LONG);
977 }
978 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
979 public void visitLSHR(LSHR o){
980 stack().pop();
981 stack().pop();
982 stack().push(Type.LONG);
983 }
984 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
985 public void visitLSTORE(LSTORE o){
986 locals().set(o.getIndex(), stack().pop());
987 locals().set(o.getIndex()+1, Type.UNKNOWN);
988 }
989 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
990 public void visitLSUB(LSUB o){
991 stack().pop();
992 stack().pop();
993 stack().push(Type.LONG);
994 }
995 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
996 public void visitLUSHR(LUSHR o){
997 stack().pop();
998 stack().pop();
999 stack().push(Type.LONG);
1000 }
1001 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1002 public void visitLXOR(LXOR o){
1003 stack().pop();
1004 stack().pop();
1005 stack().push(Type.LONG);
1006 }
1007 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1008 public void visitMONITORENTER(MONITORENTER o){
1009 stack().pop();
1010 }
1011 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1012 public void visitMONITOREXIT(MONITOREXIT o){
1013 stack().pop();
1014 }
1015 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1016 public void visitMULTIANEWARRAY(MULTIANEWARRAY o){
1017 for (int i=0; i<o.getDimensions(); i++){
1018 stack().pop();
1019 }
1020 stack().push(o.getType(cpg));
1021 }
1022 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1023 public void visitNEW(NEW o){
1024 stack().push(new UninitializedObjectType((ObjectType) (o.getType(cpg))));
1025 }
1026 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1027 public void visitNEWARRAY(NEWARRAY o){
1028 stack().pop();
1029 stack().push(o.getType());
1030 }
1031 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1032 public void visitNOP(NOP o){
1033 }
1034 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1035 public void visitPOP(POP o){
1036 stack().pop();
1037 }
1038 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1039 public void visitPOP2(POP2 o){
1040 Type t = stack().pop();
1041 if (t.getSize() == 1){
1042 stack().pop();
1043 }
1044 }
1045 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1046 public void visitPUTFIELD(PUTFIELD o){
1047 stack().pop();
1048 stack().pop();
1049 }
1050 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1051 public void visitPUTSTATIC(PUTSTATIC o){
1052 stack().pop();
1053 }
1054 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1055 public void visitRET(RET o){
1056
1057
1058 }
1059 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1060 public void visitRETURN(RETURN o){
1061
1062 }
1063 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1064 public void visitSALOAD(SALOAD o){
1065 stack().pop();
1066 stack().pop();
1067 stack().push(Type.INT);
1068 }
1069 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1070 public void visitSASTORE(SASTORE o){
1071 stack().pop();
1072 stack().pop();
1073 stack().pop();
1074 }
1075 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1076 public void visitSIPUSH(SIPUSH o){
1077 stack().push(Type.INT);
1078 }
1079 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1080 public void visitSWAP(SWAP o){
1081 Type t = stack().pop();
1082 Type u = stack().pop();
1083 stack().push(t);
1084 stack().push(u);
1085 }
1086 /*** Symbolically executes the corresponding Java Virtual Machine instruction. */
1087 public void visitTABLESWITCH(TABLESWITCH o){
1088 stack().pop();
1089 }
1090 }