⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findpuzzlers.java

📁 A static analysis tool to find bugs in Java programs
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
						.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 + -