Package edu.umd.cs.findbugs.ba.vna

Examples of edu.umd.cs.findbugs.ba.vna.ValueNumberFrame


        Instruction i = handle.getInstruction();
        if (i instanceof InvokeInstruction) {
            InvokeInstruction ii = (InvokeInstruction) i;
            XMethod m = XFactory.createXMethod(ii, cpg);
            if (TypeQualifierDataflowAnalysis.isIdentifyFunctionForTypeQualifiers(m)) {
                ValueNumberFrame vnaFrameAtLocation = vnaDataflow.getFactAtLocation(location);
                ValueNumberFrame vnaFrameAfterInstruction = vnaDataflow.getFactAfterLocation(location);
                ValueNumber in = vnaFrameAtLocation.getStackValue(0);
                ValueNumber out = vnaFrameAfterInstruction.getStackValue(0);
                fact.copyInfo(in, out);
                return;
            }
        }
View Full Code Here


            throws DataflowAnalysisException {

        Instruction ins = handle.getInstruction();
        short opcode = ins.getOpcode();
        if (opcode == Constants.MONITORENTER || opcode == Constants.MONITOREXIT) {
            ValueNumberFrame frame = vnaDataflow.getFactAtLocation(new Location(handle, basicBlock));

            modifyLock(frame, fact, opcode == Constants.MONITORENTER ? 1 : -1);

        } else if (opcode == Constants.INVOKEVIRTUAL || opcode == Constants.INVOKEINTERFACE) {

            InvokeInstruction inv = (InvokeInstruction) ins;
            String name = inv.getMethodName(methodGen.getConstantPool());
            String sig = inv.getSignature(methodGen.getConstantPool());
            ValueNumberFrame frame = vnaDataflow.getFactAtLocation(new Location(handle, basicBlock));

            if (sig.equals("()V") && (name.equals("lock") || name.equals("lockInterruptibly"))) {
                modifyLock(frame, fact, 1);
            } else if (sig.equals("()V") && (name.equals("unlock"))) {
                modifyLock(frame, fact, -1);
View Full Code Here

    private void modelReturn(TypeQualifierAnnotation returnValueAnnotation, Location location) throws DataflowAnalysisException {
        When when = (returnValueAnnotation != null) ? returnValueAnnotation.when : When.UNKNOWN;

        // Model return statement
        ValueNumberFrame vnaFrameAtReturn = vnaDataflow.getFactAtLocation(location);
        if (vnaFrameAtReturn.isValid()) {
            ValueNumber topValue = vnaFrameAtReturn.getTopValue();
            SourceSinkInfo sink = new SourceSinkInfo(SourceSinkType.RETURN_VALUE, location, topValue, when);
            registerSourceSink(sink);
        }
    }
View Full Code Here

                typeQualifierValue);
        When when = (tqa != null) ? tqa.when : When.UNKNOWN;

        // The ValueNumberFrame *before* the FieldInstruction should
        // have the ValueNumber of the stored value on the top of the stack.
        ValueNumberFrame vnaFrameAtStore = vnaDataflow.getFactAtLocation(location);
        if (vnaFrameAtStore.isValid()) {
            ValueNumber vn = vnaFrameAtStore.getTopValue();
            SourceSinkInfo sink = new SourceSinkInfo(SourceSinkType.FIELD_STORE, location, vn, when);
            registerSourceSink(sink);
        }
    }
View Full Code Here

        SignatureParser sigParser = new SignatureParser(calledMethod.getSignature());
        if (sigParser.getNumParameters() == 0) {
            return;
        }
        ValueNumberFrame vnaFrame = vnaDataflow.getFactAtLocation(location);

        if (!vnaFrame.isValid()) {
            // AnalysisContext.logError("bad vna frame  in " + xmethod +
            // " at location " + location.getHandle().getPosition() +
            // " calling " + calledMethod);
            return;
        }

        if (TypeQualifierDataflowAnalysis.isIdentifyFunctionForTypeQualifiers(calledMethod)) {
            return;
        }

        for (int param = 0; param < calledMethod.getNumParams(); param++) {
            TypeQualifierAnnotation tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation(calledMethod, param,
                    typeQualifierValue);

            boolean interproc = false;
            if (TypeQualifierDatabase.USE_DATABASE && tqa == null) {
                // See if there's an entry for this parameter
                // in the interprocedural type qualifier database.
                TypeQualifierDatabase tqdb = Global.getAnalysisCache().getDatabase(TypeQualifierDatabase.class);
                tqa = tqdb.getParameter(calledMethod.getMethodDescriptor(), param, typeQualifierValue);
                if (tqa != null) {
                    interproc = true;
                }
            }

            When when = (tqa != null) ? tqa.when : When.UNKNOWN;

            ValueNumber vn = vnaFrame.getArgument(inv, cpg, param, sigParser);

            SourceSinkInfo info = new SourceSinkInfo(SourceSinkType.ARGUMENT_TO_CALLED_METHOD, location, vn, when);
            info.setParameter(param);
            info.setInterproc(interproc);
View Full Code Here

            fact.clear();
            return;
        }

        // Get value number frame
        ValueNumberFrame vnaFrame = vnaDataflow.getFactAtLocation(location);
        if (!vnaFrame.isValid()) {
            if (DEBUG) {
                System.out.println("MAKING TOP1 AT: " + location);
            }
            // Probably dead code.
            // Assume this location can't be reached.
View Full Code Here

     *            edge to check for merge input values
     * @return possibly-modified dataflow value
     */
    private UnconditionalValueDerefSet propagateDerefSetsToMergeInputValues(UnconditionalValueDerefSet fact, Edge edge) {

        ValueNumberFrame blockValueNumberFrame = vnaDataflow.getResultFact(edge.getSource());
        ValueNumberFrame targetValueNumberFrame = vnaDataflow.getStartFact(edge.getTarget());

        UnconditionalValueDerefSet originalFact = fact;
        fact = duplicateFact(fact);

        if (blockValueNumberFrame.isValid() && targetValueNumberFrame.isValid()) {
            int slots = 0;
            if (targetValueNumberFrame.getNumSlots() == blockValueNumberFrame.getNumSlots()) {
                slots = targetValueNumberFrame.getNumSlots();
            } else if (targetValueNumberFrame.getNumLocals() == blockValueNumberFrame.getNumLocals()) {
                slots = targetValueNumberFrame.getNumLocals();
            }

            if (slots > 0) {
                if (DEBUG) {
                    System.out.println("** Valid VNA frames for " + edge);
                    System.out.println("** Block : " + blockValueNumberFrame);
                    System.out.println("** Target: " + targetValueNumberFrame);
                }

                for (int i = 0; i < slots; i++) {
                    ValueNumber blockVN = blockValueNumberFrame.getValue(i);
                    ValueNumber targetVN = targetValueNumberFrame.getValue(i);
                    if (blockVN.equals(targetVN)) {
                        continue;
                    }
                    fact.clearDerefSet(blockVN);
                    if (originalFact.isUnconditionallyDereferenced(targetVN)) {
                        fact.setDerefSet(blockVN, originalFact.getUnconditionalDerefLocationSet(targetVN));
                    }

                } // for all slots

                for (ValueNumber blockVN : blockValueNumberFrame.valueNumbersForLoads()) {
                    AvailableLoad load = blockValueNumberFrame.getLoad(blockVN);
                    if (load == null) {
                        continue;
                    }
                    ValueNumber[] targetVNs = targetValueNumberFrame.getAvailableLoad(load);
                    if (targetVNs != null) {
                        for (ValueNumber targetVN : targetVNs) {
                            if (targetVN.hasFlag(ValueNumber.PHI_NODE) && fact.isUnconditionallyDereferenced(targetVN)
                                    && !fact.isUnconditionallyDereferenced(blockVN)) {
                                // Block VN is also dereferenced
                                // unconditionally.
                                AvailableLoad targetLoad = targetValueNumberFrame.getLoad(targetVN);
                                if (!load.equals(targetLoad)) {
                                    continue;
                                }
                                if (DEBUG) {
                                    System.out.println("** Copy vn derefs for " + load + " from " + targetVN + " --> " + blockVN);
View Full Code Here

            while (i.hasNext()) {
                Location loc = i.next();
                InstructionHandle handle = loc.getHandle();
                Instruction ins = handle.getInstruction();
                if (ins instanceof ReturnInstruction && !(ins instanceof RETURN)) {
                    ValueNumberFrame vnaFrame = vnaDataflow.getFactAtLocation(loc);
                    ValueNumber topVN = vnaFrame.getTopValue();

                    TypeQualifierValueSet flowSet = dataflow.getFactAtLocation(loc);
                    FlowValue topFlowValue = flowSet.getValue(topVN);

                    if (topFlowValue != null) {
View Full Code Here

    private void registerTopOfStackSource(SourceSinkType sourceSinkType, Location location, When when, boolean interproc,
            @CheckForNull Object constantValue) throws DataflowAnalysisException {
        if (when == When.UNKNOWN && !typeQualifierValue.isStrictQualifier()) {
            return;
        }
        ValueNumberFrame vnaFrameAfterInstruction = vnaDataflow.getFactAfterLocation(location);
        if (vnaFrameAfterInstruction.isValid()) {
            ValueNumber tosValue = vnaFrameAfterInstruction.getTopValue();
            SourceSinkInfo sourceSinkInfo = new SourceSinkInfo(sourceSinkType, location, tosValue, when);
            sourceSinkInfo.setInterproc(interproc);
            sourceSinkInfo.setConstantValue(constantValue);
            registerSourceSink(sourceSinkInfo);
        }
View Full Code Here

            registerSourceSink(sourceSinkInfo);
        }
    }

    private void registerParameterSources() {
        ValueNumberFrame vnaFrameAtEntry = vnaDataflow.getStartFact(cfg.getEntry());

        SignatureParser sigParser = new SignatureParser(xmethod.getSignature());
        int firstParamSlot = xmethod.isStatic() ? 0 : 1;

        int param = 0;
        int slotOffset = 0;

        for ( String paramSig : sigParser.parameterSignatures()) {

            // Get the TypeQualifierAnnotation for this parameter
            SourceSinkInfo info;
            TypeQualifierAnnotation tqa = TypeQualifierApplications.getEffectiveTypeQualifierAnnotation(xmethod, param,
                    typeQualifierValue);
            When when = (tqa != null) ? tqa.when : When.UNKNOWN;
            ValueNumber vn = vnaFrameAtEntry.getValue(slotOffset + firstParamSlot);
            info = new SourceSinkInfo(SourceSinkType.PARAMETER, cfg.getLocationAtEntry(), vn, when);
            info.setParameterAndLocal(param, slotOffset + firstParamSlot);
            registerSourceSink(info);

            param++;
View Full Code Here

TOP

Related Classes of edu.umd.cs.findbugs.ba.vna.ValueNumberFrame

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.