protected ThrowableSet mightThrow(SootMethodRef m) { // The throw analysis is used in the front-ends. Conseqeuently, some // methods might not yet be loaded. If this is the case, we make // conservative assumptions. SootMethod sm = m.tryResolve(); if (sm != null) { return mightThrow(sm); } else { return mgr.ALL_THROWABLES; } }
@SuppressWarnings("rawtypes") public void casePhiExpr(PhiExpr e) { for (Iterator i = e.getUseBoxes().iterator(); i.hasNext();) { ValueBox box = (ValueBox) i.next(); result = result.add(mightThrow(box.getValue())); } }
@Override public void caseLookupSwitchStmt(LookupSwitchStmt s) { result = result.add(mightThrow(s.getKey())); }
private void caseBinopExpr(BinopExpr expr) { result = result.add(mightThrow(expr.getOp1())); result = result.add(mightThrow(expr.getOp2())); }
@Override public void caseInvokeStmt(InvokeStmt s) { result = result.add(mightThrow(s.getInvokeExpr())); }
@Override public void caseTableSwitchStmt(TableSwitchStmt s) { result = result.add(mightThrow(s.getKey())); }
@SuppressWarnings("rawtypes") public void caseNewExpr(NewExpr expr) { result = result.add(mgr.INITIALIZATION_ERRORS); for (Iterator i = expr.getUseBoxes().iterator(); i.hasNext();) { ValueBox box = (ValueBox) i.next(); result = result.add(mightThrow(box.getValue())); } }
@Override public void caseEnterMonitorStmt(EnterMonitorStmt s) { result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(s.getOp())); }
public void caseArrayRef(ArrayRef ref) { result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mgr.ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION); result = result.add(mightThrow(ref.getBase())); result = result.add(mightThrow(ref.getIndex())); }
@Override public void caseStaticInvokeInst(StaticInvokeInst i) { result = result.add(mgr.INITIALIZATION_ERRORS); result = result.add(mightThrow(i.getMethodRef())); }
public void caseStaticInvokeExpr(StaticInvokeExpr expr) { result = result.add(mgr.INITIALIZATION_ERRORS); for (int i = 0; i < expr.getArgCount(); i++) { result = result.add(mightThrow(expr.getArg(i))); } result = result.add(mightThrow(expr.getMethodRef())); }
private void caseInstanceInvokeExpr(InstanceInvokeExpr expr) { result = result.add(mgr.RESOLVE_METHOD_ERRORS); result = result.add(mgr.NULL_POINTER_EXCEPTION); for (int i = 0; i < expr.getArgCount(); i++) { result = result.add(mightThrow(expr.getArg(i))); } result = result.add(mightThrow(expr.getBase())); result = result.add(mightThrow(expr.getMethodRef())); } }
@Override public void caseAssignStmt(AssignStmt s) { Value lhs = s.getLeftOp(); if (lhs instanceof ArrayRef && (lhs.getType() instanceof UnknownType || lhs.getType() instanceof RefType)) { // This corresponds to an aastore byte code. result = result.add(mgr.ARRAY_STORE_EXCEPTION); } result = result.add(mightThrow(s.getLeftOp())); result = result.add(mightThrow(s.getRightOp())); }
@Override public void caseExitMonitorStmt(ExitMonitorStmt s) { result = result.add(mgr.ILLEGAL_MONITOR_STATE_EXCEPTION); result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(s.getOp())); }
@Override public void caseVirtualInvokeInst(VirtualInvokeInst i) { result = result.add(mgr.RESOLVE_METHOD_ERRORS); result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(i.getMethodRef())); }
@Override public void caseSpecialInvokeInst(SpecialInvokeInst i) { result = result.add(mgr.RESOLVE_METHOD_ERRORS); result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(i.getMethodRef())); }
public void caseInstanceFieldRef(InstanceFieldRef ref) { result = result.add(mgr.RESOLVE_FIELD_ERRORS); result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(ref.getBase())); }
@Override public void caseInterfaceInvokeInst(InterfaceInvokeInst i) { result = result.add(mgr.RESOLVE_METHOD_ERRORS); result = result.add(mgr.NULL_POINTER_EXCEPTION); result = result.add(mightThrow(i.getMethodRef())); }
public void caseNewMultiArrayExpr(NewMultiArrayExpr expr) { result = result.add(mgr.RESOLVE_CLASS_ERRORS); for (int i = 0; i < expr.getSizeCount(); i++) { Value count = expr.getSize(i); if ((!(count instanceof IntConstant)) || (((IntConstant) count).lessThan(INT_CONSTANT_ZERO).equals(INT_CONSTANT_ZERO))) { result = result.add(mgr.NEGATIVE_ARRAY_SIZE_EXCEPTION); } result = result.add(mightThrow(count)); } }
public void caseNewArrayExpr(NewArrayExpr expr) { if (expr.getBaseType() instanceof RefLikeType) { result = result.add(mgr.RESOLVE_CLASS_ERRORS); } Value count = expr.getSize(); if ((!(count instanceof IntConstant)) || (((IntConstant) count).lessThan(INT_CONSTANT_ZERO).equals(INT_CONSTANT_ZERO))) { result = result.add(mgr.NEGATIVE_ARRAY_SIZE_EXCEPTION); } result = result.add(mightThrow(count)); }