private void pop(int count) { while ((count--) > 0) { pop(); } }
public void replaceTop(Item newTop) { pop(); push(newTop); }
private void handleDup() { Item it; it = pop(); push(it); push(it); }
private void handleLcmp() { Item it = pop(); Item it2 = pop(); if ((it.getConstant() != null) && it2.getConstant() != null) { long l = constantToLong(it); long l2 = constantToLong(it2); if (l2 < l) { push(new Item("I", Integer.valueOf(-1))); } else if (l2 > l) { push(new Item("I", Integer.valueOf(1))); } else { push(new Item("I", Integer.valueOf(0))); } } else { push(new Item("I")); } }
private void pushByInvoke(DismantleBytecode dbc, boolean popThis) { String signature = dbc.getSigConstantOperand(); if (Const.CONSTRUCTOR_NAME.equals(dbc.getNameConstantOperand()) && signature.endsWith(")V") && popThis) { pop(PreorderVisitor.getNumberArguments(signature)); Item constructed = pop(); if (getStackDepth() > 0) { Item next = getStackItem(0); if (constructed.equals(next)) { next = new Item(next); next.source = XFactory.createReferencedXMethod(dbc); next.pc = dbc.getPC(); replace(0, next); } } return; } pop(PreorderVisitor.getNumberArguments(signature) + (popThis ? 1 : 0)); pushBySignature(new SignatureParser(signature).getReturnTypeSignature(), dbc); }
private void processInvokeDynamic(DismantleBytecode dbc) { String signature = dbc.getSigConstantOperand(); int numberArguments = PreorderVisitor.getNumberArguments(signature); pop(numberArguments); pushBySignature(new SignatureParser(signature).getReturnTypeSignature(), dbc); }
private void handleDcmp(int opcode) { Item it = pop(); Item it2 = pop(); if ((it.getConstant() != null) && it2.getConstant() != null) { double d = constantToDouble(it); double d2 = constantToDouble(it2); if (Double.isNaN(d) || Double.isNaN(d2)) { if (opcode == Const.DCMPG) { push(new Item("I", Integer.valueOf(1))); } else { push(new Item("I", Integer.valueOf(-1))); } } if (d2 < d) { push(new Item("I", Integer.valueOf(-1))); } else if (d2 > d) { push(new Item("I", Integer.valueOf(1))); } else { push(new Item("I", Integer.valueOf(0))); } } else { push(new Item("I")); } }
private void handleFcmp(int opcode) { Item it = pop(); Item it2 = pop(); if ((it.getConstant() != null) && it2.getConstant() != null) { float f = constantToFloat(it); float f2 = constantToFloat(it2); if (Float.isNaN(f) || Float.isNaN(f2)) { if (opcode == Const.FCMPG) { push(new Item("I", Integer.valueOf(1))); } else { push(new Item("I", Integer.valueOf(-1))); } } if (f2 < f) { push(new Item("I", Integer.valueOf(-1))); } else if (f2 > f) { push(new Item("I", Integer.valueOf(1))); } else { push(new Item("I", Integer.valueOf(0))); } } else { push(new Item("I")); } }
private void pushByLocalStore(int register) { Item it = new Item(pop()); if (it.getRegisterNumber() != register) { clearRegisterLoad(lvValues, register); clearRegisterLoad(stack, register); } if (it.registerNumber == -1) { it.registerNumber = register; } setLVValue(register, it); }
Item value = pop(); String newSignature = new SignatureParser(signature).getReturnTypeSignature(); Item newValue = new Item(value, newSignature); Object value = item.getConstant(); if (value instanceof Integer && ((Integer) value).intValue() == 1) { pop(3); Item newTop = getStackItem(0); if ("Ljava/io/FileOutputStream;".equals(newTop.signature)) { pop(2); Item newTop = getStackItem(0); newTop.setSpecialKind(Item.FILE_OPENED_IN_APPEND_MODE); Item requestParameter = pop(); pop(); Item result = new Item("Ljava/lang/String;"); result.setServletParameterTainted(); } else if (seen == Const.INVOKEINTERFACE && "getQueryString".equals(methodName) && "javax/servlet/http/HttpServletRequest".equals(clsName) || "javax/servlet/http/ServletRequest".equals(clsName)) { pop(); Item result = new Item("Ljava/lang/String;"); result.setServletParameterTainted(); } else if (seen == Const.INVOKEINTERFACE && "getHeader".equals(methodName) && "javax/servlet/http/HttpServletRequest".equals(clsName) || "javax/servlet/http/ServletRequest".equals(clsName)) { /* Item requestParameter = */pop(); pop();
pop(); push(new Item("I")); break; Item topItem = pop(); seenTransferOfControl = true; setReachOnlyByBranch(true); pop(); addJumpValue(dbc.getPC(), dbc.getBranchTarget()); int pc = dbc.getBranchTarget() - dbc.getBranchOffset(); pop(); break; case Const.MONITORENTER: case Const.MONITOREXIT: case Const.POP: pop(); break; pop(); eraseKnowledgeOf(dbc.getXFieldOperand()); break; case Const.PUTFIELD: pop(2); eraseKnowledgeOf(dbc.getXFieldOperand()); break; Item right = pop();
private void processInvokeDynamic(DismantleBytecode dbc) { String signature = dbc.getSigConstantOperand(); int numberArguments = PreorderVisitor.getNumberArguments(signature); pop(numberArguments); pushBySignature(new SignatureParser(signature).getReturnTypeSignature(), dbc); }