@Override public ResourceValueFrame createFact() { ResourceValueFrame fact = new ResourceValueFrame(methodGen.getMaxLocals()); fact.setTop(); return fact; }
@Override public void initEntryFact(ResourceValueFrame result) { result.setValid(); result.clearStack(); final int numSlots = result.getNumSlots(); for (int i = 0; i < numSlots; ++i) { boolean slotContainsInstance = resourceTracker.isParamInstance(resource, i); result.setValue(i, slotContainsInstance ? ResourceValue.instance() : ResourceValue.notInstance()); } }
if (fact.getStatus() == ResourceValueFrame.OPEN) { tmpFact.setStatus(ResourceValueFrame.OPEN_ON_EXCEPTION_PATH); if (fact.isValid()) { resource, fact)) { tmpFact = modifyFrame(fact, tmpFact); tmpFact.setStatus(ResourceValueFrame.CLOSED); if (DEBUG) { System.out.print("(failed attempt to close)"); if (fact.isValid()) { tmpFact = modifyFrame(fact, tmpFact); tmpFact.clearStack(); tmpFact.pushValue(ResourceValue.notInstance()); if (startFrame.isValid()) { ResourceValue topValue = frameAtIf.getValue(frameAtIf.getNumSlots() - 1); tmpFact.setStatus(ResourceValueFrame.NONEXISTENT);
@Override public void visitCHECKCAST(CHECKCAST obj) { try { ResourceValueFrame frame = getFrame(); ResourceValue topValue; topValue = frame.getTopValue(); if (topValue.equals(ResourceValue.instance())) { frame.setStatus(ResourceValueFrame.ESCAPED); } } catch (DataflowAnalysisException e) { AnalysisContext.logError("Analysis error", e); } }
System.out.println("resource frame before instruction: " + frame.toString()); final int updatedNumSlots = frame.getNumSlots(); System.out.println("Saw lock value!"); frame.setValue(i, ResourceValue.instance()); frame.setStatus(status); System.out.println("resource frame after instruction: " + frame.toString());
private void handleInvoke(InvokeInstruction inv) { ResourceValueFrame frame = getFrame(); int numSlots = frame.getNumSlots(); int numConsumed = getNumWordsConsumed(inv); // See if the resource instance is passed as an argument int instanceArgNum = -1; for (int i = numSlots - numConsumed, argCount = 0; i < numSlots; ++i, ++argCount) { ResourceValue value = frame.getValue(i); if (value.equals(ResourceValue.instance())) { instanceArgNum = argCount; break; } } if (instanceArgNum >= 0 && instanceEscapes(inv, instanceArgNum)) { frame.setStatus(ResourceValueFrame.ESCAPED); } handleNormalInstruction(inv); }
frame.setStatus(status); if (created) { frame.setValue(frame.getNumSlots() - 1, ResourceValue.instance());
private ResourceValue getInstanceValue(ResourceValueFrame frame, InvokeInstruction inv, ConstantPoolGen cpg) { int numConsumed = inv.consumeStack(cpg); if (numConsumed == Const.UNPREDICTABLE) { throw new IllegalStateException(); } return frame.getValue(frame.getNumSlots() - numConsumed); }
public boolean isStreamOpen(BasicBlock basicBlock, InstructionHandle handle, ConstantPoolGen cpg, ResourceValueFrame frame) { if (isOpenOnCreation) { return false; } Instruction ins = handle.getInstruction(); if (!(ins instanceof INVOKESPECIAL)) { return false; } // Does this instruction open the stream? INVOKESPECIAL inv = (INVOKESPECIAL) ins; return frame.isValid() && getInstanceValue(frame, inv, cpg).isInstance() && matchMethod(inv, cpg, this.getResourceClass(), Const.CONSTRUCTOR_NAME); }
@Override public void inspectResult(ClassContext classContext, MethodGen methodGen, CFG cfg, Dataflow<ResourceValueFrame, ResourceValueAnalysis<Stream>> dataflow, Stream stream) { if (DEBUG) { System.out.printf("Result for %s in %s%n", stream, methodGen); dataflow.dumpDataflow(dataflow.getAnalysis()); } ResourceValueFrame exitFrame = dataflow.getResultFact(cfg.getExit()); int exitStatus = exitFrame.getStatus(); if (exitStatus == ResourceValueFrame.OPEN || exitStatus == ResourceValueFrame.OPEN_ON_EXCEPTION_PATH) { // FIXME: Stream object should be queried for the // priority. String bugType = stream.getBugType(); int priority = NORMAL_PRIORITY; if (exitStatus == ResourceValueFrame.OPEN_ON_EXCEPTION_PATH) { bugType += "_EXCEPTION_PATH"; priority = LOW_PRIORITY; } potentialOpenStreamList.add(new PotentialOpenStream(bugType, priority, stream)); } else if (exitStatus == ResourceValueFrame.CLOSED) { // Remember that this stream was closed on all paths. // Later, we will mark all of the streams in its equivalence class // as having been closed. stream.setClosed(); } }
@Override public boolean isResourceClose(BasicBlock basicBlock, InstructionHandle handle, ConstantPoolGen cpg, Lock resource, ResourceValueFrame frame) throws DataflowAnalysisException { if (!mightCloseResource(basicBlock, handle, cpg)) { return false; } ResourceValue topValue = frame.getTopValue(); return topValue.isInstance(); }
if (fact.getStatus() == ResourceValueFrame.OPEN) { tmpFact.setStatus(ResourceValueFrame.OPEN_ON_EXCEPTION_PATH); if (fact.isValid()) { resource, fact)) { tmpFact = modifyFrame(fact, tmpFact); tmpFact.setStatus(ResourceValueFrame.CLOSED); if (DEBUG) { System.out.print("(failed attempt to close)"); if (fact.isValid()) { tmpFact = modifyFrame(fact, tmpFact); tmpFact.clearStack(); tmpFact.pushValue(ResourceValue.notInstance()); if (startFrame.isValid()) { ResourceValue topValue = frameAtIf.getValue(frameAtIf.getNumSlots() - 1); tmpFact.setStatus(ResourceValueFrame.NONEXISTENT);
private void handleFieldStore(FieldInstruction ins) { try { // If the resource instance is stored in a field, then it escapes ResourceValueFrame frame = getFrame(); ResourceValue topValue = frame.getTopValue(); if (topValue.equals(ResourceValue.instance())) { frame.setStatus(ResourceValueFrame.ESCAPED); } } catch (DataflowAnalysisException e) { throw new InvalidBytecodeException("Stack underflow", e); } handleNormalInstruction(ins); }
System.out.println("resource frame before instruction: " + frame.toString()); final int updatedNumSlots = frame.getNumSlots(); System.out.println("Saw lock value!"); frame.setValue(i, ResourceValue.instance()); frame.setStatus(status); System.out.println("resource frame after instruction: " + frame.toString());
private void handleInvoke(InvokeInstruction inv) { ResourceValueFrame frame = getFrame(); int numSlots = frame.getNumSlots(); int numConsumed = getNumWordsConsumed(inv); // See if the resource instance is passed as an argument int instanceArgNum = -1; for (int i = numSlots - numConsumed, argCount = 0; i < numSlots; ++i, ++argCount) { ResourceValue value = frame.getValue(i); if (value.equals(ResourceValue.instance())) { instanceArgNum = argCount; break; } } if (instanceArgNum >= 0 && instanceEscapes(inv, instanceArgNum)) { frame.setStatus(ResourceValueFrame.ESCAPED); } handleNormalInstruction(inv); }
frame.setStatus(status); if (created) { frame.setValue(frame.getNumSlots() - 1, ResourceValue.instance());
private ResourceValue getInstanceValue(ResourceValueFrame frame, InvokeInstruction inv, ConstantPoolGen cpg) { int numConsumed = inv.consumeStack(cpg); if (numConsumed == Constants.UNPREDICTABLE) { throw new IllegalStateException(); } return frame.getValue(frame.getNumSlots() - numConsumed); }