private void pushBySignature(String s, DismantleBytecode dbc) { if ("V".equals(s)) { return; } Item item = new Item(s, (Object) null); if (dbc != null) { item.setPC(dbc.getPC()); } if ("B".equals(s)) { item.setSpecialKind(Item.SIGNED_BYTE); } else if ("C".equals(s)) { item.setSpecialKind(Item.NON_NEGATIVE); } push(item); }
OpcodeStack.Item item = new Item("I"); if (oneMeansNull) { item.setSpecialKind(Item.NONZERO_MEANS_NULL); } else { item.setSpecialKind(Item.ZERO_MEANS_NULL);
newValue = new Item("J", Long.valueOf(lhsValue << constantToInt(rhs))); if (constantToInt(rhs) >= 8) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); newValue = new Item("J", Long.valueOf(lhsValue & rhsValue)); if ((rhsValue & 0xff) == 0 && rhsValue != 0 || (lhsValue & 0xff) == 0 && lhsValue != 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); } else if (lhs.getConstant() != null && seen == Const.LAND && (constantToLong(lhs) & 0xff) == 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); } else if (rhs.getConstant() != null && seen == Const.LAND && (constantToLong(rhs) & 0xff) == 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR);
private void pushByDoubleMath(int seen, Item it, Item it2) { Item result; @SpecialKind int specialKind = Item.FLOAT_MATH; if ((it.getConstant() instanceof Double) && it2.getConstant() instanceof Double) { if (seen == DADD) { result = new Item("D", Double.valueOf(constantToDouble(it2) + constantToDouble(it))); } else if (seen == DSUB) { result = new Item("D", Double.valueOf(constantToDouble(it2) - constantToDouble(it))); } else if (seen == DMUL) { result = new Item("D", Double.valueOf(constantToDouble(it2) * constantToDouble(it))); } else if (seen == DDIV) { result = new Item("D", Double.valueOf(constantToDouble(it2) / constantToDouble(it))); } else if (seen == DREM) { result = new Item("D", Double.valueOf(constantToDouble(it2) % constantToDouble(it))); } else { result = new Item("D"); // ? } } else { result = new Item("D"); if (seen == DDIV) { specialKind = Item.NASTY_FLOAT_MATH; } } result.setSpecialKind(specialKind); push(result); }
private void pushByFloatMath(int seen, Item it, Item it2) { Item result; @SpecialKind int specialKind = Item.FLOAT_MATH; if ((it.getConstant() instanceof Float) && it2.getConstant() instanceof Float) { if (seen == FADD) { result = new Item("F", Float.valueOf(constantToFloat(it2) + constantToFloat(it))); } else if (seen == FSUB) { result = new Item("F", Float.valueOf(constantToFloat(it2) - constantToFloat(it))); } else if (seen == FMUL) { result = new Item("F", Float.valueOf(constantToFloat(it2) * constantToFloat(it))); } else if (seen == FDIV) { result = new Item("F", Float.valueOf(constantToFloat(it2) / constantToFloat(it))); } else if (seen == FREM) { result = new Item("F", Float.valueOf(constantToFloat(it2) % constantToFloat(it))); } else { result = new Item("F"); } } else { result = new Item("F"); if (seen == DDIV) { specialKind = Item.NASTY_FLOAT_MATH; } } result.setSpecialKind(specialKind); push(result); }
private void pushBySignature(String s, DismantleBytecode dbc) { if ("V".equals(s)) { return; } Item item = new Item(s, (Object) null); if (dbc != null) { item.setPC(dbc.getPC()); } if ("B".equals(s)) { item.setSpecialKind(Item.SIGNED_BYTE); } else if ("C".equals(s)) { item.setSpecialKind(Item.NON_NEGATIVE); } push(item); }
public void setIsServletWriter() { setSpecialKind(Item.SERVLET_OUTPUT); }
public void setServletParameterTainted() { setSpecialKind(Item.SERVLET_REQUEST_TAINTED); } public void setIsServletWriter() {
@Override public void afterOpcode(int seen) { boolean isInvokingGetMessage = isInvokingGetMessage(seen); super.afterOpcode(seen); if (isInvokingGetMessage && !stack.isTop()) { stack.getStackItem(0).setSpecialKind(isMessage); } }
public static Item typeOnly(String signature) { Item it = new Item(signature, UNKNOWN); it.setSpecialKind(TYPE_ONLY); return it; } public Item(Item it) {
Item i = new Item(dbc.getSigConstantOperand(), field, Integer.MAX_VALUE); if ("separator".equals(field.getFieldName()) && "java.io.File".equals(field.getClassName())) { i.setSpecialKind(Item.FILE_SEPARATOR_STRING); for (Item item : stack) { if (item != null && item.getSpecialKind() == specialKind) { item.setSpecialKind(Item.NOT_SPECIAL); item.setSpecialKind(Item.NOT_SPECIAL); for (Item i : stack) { if (i != null && i.mightRarelyBeNegative()) { i.setSpecialKind(Item.NOT_SPECIAL); i.setSpecialKind(Item.NOT_SPECIAL); Item array = pop(); Item newItem = new Item("I", array.getConstant()); newItem.setSpecialKind(Item.NON_NEGATIVE); push(newItem); pop(2); Item newItem = new Item("I"); newItem.setSpecialKind(Item.SIGNED_BYTE); push(newItem); break; pop(2); Item newItem = new Item("I");
Item newTop = getStackItem(0); if ("Ljava/io/FileOutputStream;".equals(newTop.signature)) { newTop.setSpecialKind(Item.FILE_OPENED_IN_APPEND_MODE); newTop.source = XFactory.createReferencedXMethod(dbc); newTop.setPC(dbc.getPC()); newTop.setSpecialKind(Item.FILE_OPENED_IN_APPEND_MODE); newTop.source = XFactory.createReferencedXMethod(dbc); newTop.setPC(dbc.getPC()); this.getStackItem(0).setSpecialKind(Item.NEWLY_ALLOCATED); ) { Item i = new Item(pop()); i.setSpecialKind(Item.RANDOM_INT); push(i); } else if ("size".equals(methodName) && "()I".equals(signature) Item i = new Item(pop()); if (i.getSpecialKind() == Item.NOT_SPECIAL) { i.setSpecialKind(Item.NON_NEGATIVE); Item i = new Item(pop()); if (i.getSpecialKind() == Item.HASHCODE_INT) { i.setSpecialKind(Item.MATH_ABS_OF_HASHCODE); } else if (i.getSpecialKind() == Item.RANDOM_INT) { i.setSpecialKind(Item.MATH_ABS_OF_RANDOM); } else { i.setSpecialKind(Item.MATH_ABS);
newValue = new Item("I", lhsValue & rhsValue); if ((rhsValue & 0xff) == 0 && rhsValue != 0 || (lhsValue & 0xff) == 0 && lhsValue != 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); newValue = new Item("I", lhsValue << rhsValue); if (rhsValue >= 8) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); newValue = new Item(lhs); } else if (seen == Const.ISHL && (constant & 0x1f) >= 8) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); newValue = new Item("I", 0); } else if ((value & 0xff) == 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); } else if (value >= 0) { newValue.setSpecialKind(Item.NON_NEGATIVE); newValue = new Item("I", 0); } else if ((value & 0xff) == 0) { newValue.setSpecialKind(Item.LOW_8_BITS_CLEAR); } else if (value >= 0) { newValue.setSpecialKind(Item.NON_NEGATIVE); newValue.setSpecialKind(Item.ZERO_MEANS_NULL); newValue.setPC(lhs.getPC()); } else if (seen == Const.IAND && rhs.getSpecialKind() == Item.ZERO_MEANS_NULL) { newValue.setSpecialKind(Item.ZERO_MEANS_NULL); newValue.setPC(rhs.getPC());
case Const.ITEM_Null: Item it = new Item(); it.setSpecialKind(Item.TYPE_ONLY); return it; case Const.ITEM_InitObject:
private void pushByFloatMath(int seen, Item it, Item it2) { Item result; @SpecialKind int specialKind = Item.FLOAT_MATH; if ((it.getConstant() instanceof Float) && it2.getConstant() instanceof Float) { if (seen == Const.FADD) { result = new Item("F", Float.valueOf(constantToFloat(it2) + constantToFloat(it))); } else if (seen == Const.FSUB) { result = new Item("F", Float.valueOf(constantToFloat(it2) - constantToFloat(it))); } else if (seen == Const.FMUL) { result = new Item("F", Float.valueOf(constantToFloat(it2) * constantToFloat(it))); } else if (seen == Const.FDIV) { result = new Item("F", Float.valueOf(constantToFloat(it2) / constantToFloat(it))); } else if (seen == Const.FREM) { result = new Item("F", Float.valueOf(constantToFloat(it2) % constantToFloat(it))); } else { result = new Item("F"); } } else { result = new Item("F"); if (seen == Const.DDIV) { specialKind = Item.NASTY_FLOAT_MATH; } } result.setSpecialKind(specialKind); push(result); }
private void pushByDoubleMath(int seen, Item it, Item it2) { Item result; @SpecialKind int specialKind = Item.FLOAT_MATH; if ((it.getConstant() instanceof Double) && it2.getConstant() instanceof Double) { if (seen == Const.DADD) { result = new Item("D", Double.valueOf(constantToDouble(it2) + constantToDouble(it))); } else if (seen == Const.DSUB) { result = new Item("D", Double.valueOf(constantToDouble(it2) - constantToDouble(it))); } else if (seen == Const.DMUL) { result = new Item("D", Double.valueOf(constantToDouble(it2) * constantToDouble(it))); } else if (seen == Const.DDIV) { result = new Item("D", Double.valueOf(constantToDouble(it2) / constantToDouble(it))); } else if (seen == Const.DREM) { result = new Item("D", Double.valueOf(constantToDouble(it2) % constantToDouble(it))); } else { result = new Item("D"); // ? } } else { result = new Item("D"); if (seen == Const.DDIV) { specialKind = Item.NASTY_FLOAT_MATH; } } result.setSpecialKind(specialKind); push(result); }
public void setIsServletWriter() { setSpecialKind(Item.SERVLET_OUTPUT); }
public void setServletParameterTainted() { setSpecialKind(Item.SERVLET_REQUEST_TAINTED); } public void setIsServletWriter() {
@Test public void testDefinedItemKindIsUsedInToStringMethod() { int defined = OpcodeStack.Item.defineSpecialKind(NEW_ITEM_KIND_NAME); OpcodeStack.Item intItem = new OpcodeStack.Item("I"); intItem.setSpecialKind(defined); String result = intItem.toString(); assertTrue("Item.toString() does not use proper name of special kind:" + result, result.contains(NEW_ITEM_KIND_NAME)); } }
public static Item typeOnly(String signature) { Item it = new Item(signature, UNKNOWN); it.setSpecialKind(TYPE_ONLY); return it; } public Item(Item it) {