01: /*
02: * FindBugs - Find Bugs in Java programs
03: * Copyright (C) 2003-2007 University of Maryland
04: *
05: * This library is free software; you can redistribute it and/or
06: * modify it under the terms of the GNU Lesser General Public
07: * License as published by the Free Software Foundation; either
08: * version 2.1 of the License, or (at your option) any later version.
09: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library; if not, write to the Free Software
17: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18: */
19:
20: package edu.umd.cs.findbugs.ba.jsr305;
21:
22: import org.apache.bcel.generic.ConstantPoolGen;
23:
24: import edu.umd.cs.findbugs.ba.CFG;
25: import edu.umd.cs.findbugs.ba.DepthFirstSearch;
26: import edu.umd.cs.findbugs.ba.ReverseDepthFirstSearch;
27: import edu.umd.cs.findbugs.ba.XMethod;
28: import edu.umd.cs.findbugs.ba.vna.ValueNumberDataflow;
29: import edu.umd.cs.findbugs.classfile.CheckedAnalysisException;
30: import edu.umd.cs.findbugs.classfile.IAnalysisCache;
31: import edu.umd.cs.findbugs.classfile.MethodDescriptor;
32:
33: /**
34: * Factory for BackwardTypeQualifierDataflow objects
35: * for given type qualifier values.
36: *
37: * @author David Hovemeyer
38: */
39: public class BackwardTypeQualifierDataflowFactory
40: extends
41: TypeQualifierDataflowFactory<BackwardTypeQualifierDataflowAnalysis, BackwardTypeQualifierDataflow> {
42:
43: /**
44: * Constructor.
45: *
46: * @param methodDescriptor MethodDescriptor of the method for which we
47: * want to create BackwardTypeQualifierDataflow objects
48: */
49: public BackwardTypeQualifierDataflowFactory(
50: MethodDescriptor methodDescriptor) {
51: super (methodDescriptor);
52: }
53:
54: /* (non-Javadoc)
55: * @see edu.umd.cs.findbugs.ba.jsr305.TypeQualifierDataflowFactory#getDataflow(edu.umd.cs.findbugs.ba.DepthFirstSearch, edu.umd.cs.findbugs.ba.XMethod, edu.umd.cs.findbugs.ba.CFG, edu.umd.cs.findbugs.ba.vna.ValueNumberDataflow, org.apache.bcel.generic.ConstantPoolGen, edu.umd.cs.findbugs.classfile.IAnalysisCache, edu.umd.cs.findbugs.classfile.MethodDescriptor, edu.umd.cs.findbugs.ba.jsr305.TypeQualifierValue)
56: */
57: @Override
58: protected BackwardTypeQualifierDataflow getDataflow(
59: DepthFirstSearch dfs, XMethod xmethod, CFG cfg,
60: ValueNumberDataflow vnaDataflow, ConstantPoolGen cpg,
61: IAnalysisCache analysisCache,
62: MethodDescriptor methodDescriptor,
63: TypeQualifierValue typeQualifierValue)
64: throws CheckedAnalysisException {
65: ReverseDepthFirstSearch rdfs = analysisCache.getMethodAnalysis(
66: ReverseDepthFirstSearch.class, methodDescriptor);
67:
68: BackwardTypeQualifierDataflowAnalysis analysis = new BackwardTypeQualifierDataflowAnalysis(
69: dfs, rdfs, xmethod, cfg, vnaDataflow, cpg,
70: typeQualifierValue);
71:
72: // Get the corresponding forward dataflow.
73: // We use it to halt tracking of backwards values once we know
74: // that they encounter a conflicting forward value.
75: ForwardTypeQualifierDataflowFactory forwardFactory = analysisCache
76: .getMethodAnalysis(
77: ForwardTypeQualifierDataflowFactory.class,
78: methodDescriptor);
79: ForwardTypeQualifierDataflow forwardDataflow = forwardFactory
80: .getDataflow(typeQualifierValue);
81: analysis.setForwardTypeQualifierDataflow(forwardDataflow);
82: analysis.registerSourceSinkLocations();
83:
84: BackwardTypeQualifierDataflow dataflow = new BackwardTypeQualifierDataflow(
85: cfg, analysis);
86:
87: dataflow.execute();
88:
89: return dataflow;
90: }
91: }
|