📄 findpuzzlers.java
字号:
.addClassAndMethod(this) .addInt(valueOfConstantArgumentToShift).describe(IntAnnotation.INT_SHIFT) .addSourceLine(this) ); } if (leftHandSide != null && leftHandSide instanceof Integer && ((Integer) leftHandSide) > 0) { // boring; lie so other detectors won't get concerned constantArgumentToShift = true; valueOfConstantArgumentToShift = 8; } } } if (seen == INVOKEVIRTUAL && stack.getStackDepth() > 0 && getClassConstantOperand().equals("java/util/Date") && getNameConstantOperand().equals("setMonth") && getSigConstantOperand().equals("(I)V")) { OpcodeStack.Item item = stack.getStackItem(0); Object o = item.getConstant(); if (o != null && o instanceof Integer) { int v = (Integer) o; if (v < 0 || v > 11) bugReporter.reportBug(new BugInstance(this, "DMI_BAD_MONTH", NORMAL_PRIORITY) .addClassAndMethod(this) .addInt(v).describe(IntAnnotation.INT_VALUE) .addCalledMethod(this) .addSourceLine(this) ); } } if (seen == INVOKEVIRTUAL && stack.getStackDepth() > 1 && getClassConstantOperand().equals("java/util/Calendar") && getNameConstantOperand().equals("set") || seen == INVOKESPECIAL && stack.getStackDepth() > 1 && getClassConstantOperand().equals("java/util/GregorianCalendar") && getNameConstantOperand().equals("<init>") ) { String sig = getSigConstantOperand(); if (sig.startsWith("(III")) { int pos = sig.length() - 5; OpcodeStack.Item item = stack.getStackItem(pos); Object o = item.getConstant(); if (o != null && o instanceof Integer) { int v = (Integer) o; if (v < 0 || v > 11) bugReporter.reportBug(new BugInstance(this, "DMI_BAD_MONTH", NORMAL_PRIORITY) .addClassAndMethod(this) .addInt(v).describe(IntAnnotation.INT_VALUE) .addCalledMethod(this) .addSourceLine(this) ); } } } if (isRegisterStore() && (seen == ISTORE || seen == ISTORE_0 || seen == ISTORE_1 || seen == ISTORE_2 || seen == ISTORE_3) && getRegisterOperand() == prevOpcodeIncrementedRegister) { bugReporter.reportBug(new BugInstance(this, "DLS_OVERWRITTEN_INCREMENT", HIGH_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); } if (seen == IINC) { prevOpcodeIncrementedRegister = getRegisterOperand(); } else prevOpcodeIncrementedRegister = -1; // Java Puzzlers, Chapter 2, puzzle 1 // Look for ICONST_2 IREM ICONST_1 IF_ICMPNE L1 switch (badlyComputingOddState) { case 0: if (seen == ICONST_2) badlyComputingOddState++; break; case 1: if (seen == IREM) { OpcodeStack.Item item = stack.getStackItem(1); if (item.getSpecialKind() != OpcodeStack.Item.MATH_ABS) badlyComputingOddState++; else badlyComputingOddState = 0; } else badlyComputingOddState = 0; break; case 2: if (seen == ICONST_1) badlyComputingOddState++; else badlyComputingOddState = 0; break; case 3: if (seen == IF_ICMPEQ || seen == IF_ICMPNE) { bugReporter.reportBug(new BugInstance(this, "IM_BAD_CHECK_FOR_ODD", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); } badlyComputingOddState = 0; break; } // Java Puzzlers, chapter 3, puzzle 12 if (seen == INVOKEVIRTUAL && stack.getStackDepth() > 0 && (getNameConstantOperand().equals("toString") && getSigConstantOperand().equals("()Ljava/lang/String;") || getNameConstantOperand().equals("append") && getSigConstantOperand().equals("(Ljava/lang/Object;)Ljava/lang/StringBuilder;") && getClassConstantOperand().equals("java/lang/StringBuilder") || getNameConstantOperand().equals("append") && getSigConstantOperand().equals("(Ljava/lang/Object;)Ljava/lang/StringBuffer;") && getClassConstantOperand().equals("java/lang/StringBuffer") ) ) { String classConstants = getClassConstantOperand(); OpcodeStack.Item item = stack.getStackItem(0); String signature = item.getSignature(); if (signature != null && signature.startsWith("[")) bugReporter.reportBug(new BugInstance(this, "DMI_INVOKING_TOSTRING_ON_ARRAY", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); } if (isTigerOrHigher) { if (previousMethodInvocation != null && prevOpCode == INVOKESPECIAL && seen == INVOKEVIRTUAL) { String classNameForPreviousMethod = previousMethodInvocation.getClassName(); String classNameForThisMethod = getClassConstantOperand(); if (classNameForPreviousMethod.startsWith("java.lang.") && classNameForPreviousMethod.equals(classNameForThisMethod.replace('/','.')) && getNameConstantOperand().endsWith("Value") && getSigConstantOperand().length() == 3) { if (getSigConstantOperand().charAt(2) == previousMethodInvocation.getSignature().charAt(1)) bugReporter.reportBug(new BugInstance(this, "BX_BOXING_IMMEDIATELY_UNBOXED", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); else bugReporter.reportBug(new BugInstance(this, "BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); ternaryConversionState = 1; } else ternaryConversionState = 0; } else if (seen == INVOKEVIRTUAL) { if (getClassConstantOperand().startsWith("java/lang") && getNameConstantOperand().endsWith("Value") && getSigConstantOperand().length() == 3) ternaryConversionState = 1; else ternaryConversionState = 0; }else if (ternaryConversionState == 1) { if (I2L <= seen && seen <= I2S) ternaryConversionState = 2; else ternaryConversionState = 0; } else if (ternaryConversionState == 2) { ternaryConversionState = 0; if (seen == GOTO) bugReporter.reportBug(new BugInstance(this, "BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); } } if (seen == INVOKESTATIC) if ((getNameConstantOperand().startsWith("assert") || getNameConstantOperand().startsWith("fail")) && getMethodName().equals("run") && implementsRunnable(getThisClass())) { try { int size1 = Util.getSizeOfSurroundingTryBlock(getConstantPool(), getMethod().getCode(), "java/lang/Throwable", getPC()); int size2 = Util.getSizeOfSurroundingTryBlock(getConstantPool(), getMethod().getCode(), "java/lang/Error", getPC()); int size3 = Util.getSizeOfSurroundingTryBlock(getConstantPool(), getMethod().getCode(), "java/lang/AssertionFailureError", getPC()); int size = Math.min(Math.min( size1, size2), size3); if (size == Integer.MAX_VALUE) { JavaClass targetClass = AnalysisContext.currentAnalysisContext().lookupClass(getClassConstantOperand().replace('/', '.')); if (targetClass.getSuperclassName().startsWith("junit")) { bugReporter.reportBug(new BugInstance(this, "IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD", NORMAL_PRIORITY) .addClassAndMethod(this) .addSourceLine(this)); } } } catch (ClassNotFoundException e) { AnalysisContext.reportMissingClass(e); } } stack.sawOpcode(this,seen); if (seen == INVOKESPECIAL && getClassConstantOperand().startsWith("java/lang/") && getNameConstantOperand().equals("<init>") && getSigConstantOperand().length() == 4 ) previousMethodInvocation = XFactory.createReferencedXMethod(this); else if (seen == INVOKESTATIC && getClassConstantOperand().startsWith("java/lang/") && getNameConstantOperand().equals("valueOf") && getSigConstantOperand().length() == 4) previousMethodInvocation = XFactory.createReferencedXMethod(this); else previousMethodInvocation = null; prevOpCode = seen; } boolean implementsRunnable(JavaClass obj) { if (obj.getSuperclassName().equals("java.lang.Thread")) return true; for(String s : obj.getInterfaceNames()) if (s.equals("java.lang.Runnable")) return true; return false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -