WALA/com.ibm.wala.core/src/com/ibm/wala/cfg/exc/intra/NullPointerFrameWork.java

74 lines
2.5 KiB
Java

/******************************************************************************
* Copyright (c) 2002 - 2014 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package com.ibm.wala.cfg.exc.intra;
import com.ibm.wala.cfg.ControlFlowGraph;
import com.ibm.wala.dataflow.graph.IKilldallFramework;
import com.ibm.wala.ssa.IR;
import com.ibm.wala.ssa.ISSABasicBlock;
import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.util.graph.Acyclic;
import com.ibm.wala.util.graph.Graph;
import com.ibm.wala.util.intset.IBinaryNaturalRelation;
import com.ibm.wala.util.intset.IntPair;
/**
* Nullpointer analysis - NOT A REAL KILDALL framework instance, because the transfer
* functions are not distribute (similar to constant propagation). Therefore we remove
* back edges in the flow graph.
*
* @author Juergen Graf <graf@kit.edu>
*
*/
class NullPointerFrameWork<T extends ISSABasicBlock> implements IKilldallFramework<T, NullPointerState> {
private final Graph<T> flow;
private final NullPointerTransferFunctionProvider<T> transferFunct;
NullPointerFrameWork(ControlFlowGraph<SSAInstruction, T> cfg, IR ir) {
final IBinaryNaturalRelation backEdges = Acyclic.computeBackEdges(cfg, cfg.entry());
boolean hasBackEdge = backEdges.iterator().hasNext();
if (hasBackEdge) {
MutableCFG<SSAInstruction, T> cfg2 = MutableCFG.copyFrom(cfg);
for (IntPair edge : backEdges) {
T from = cfg2.getNode(edge.getX());
T to = cfg2.getNode(edge.getY());
cfg2.removeEdge(from, to);
cfg2.addEdge(from, cfg.exit());
}
this.flow = cfg2;
} else {
this.flow = cfg;
}
this.transferFunct = new NullPointerTransferFunctionProvider<T>(cfg, ir);
}
/* (non-Javadoc)
* @see com.ibm.wala.dataflow.graph.IKilldallFramework#getFlowGraph()
*/
@Override
public Graph<T> getFlowGraph() {
return flow;
}
/* (non-Javadoc)
* @see com.ibm.wala.dataflow.graph.IKilldallFramework#getTransferFunctionProvider()
*/
@Override
public NullPointerTransferFunctionProvider<T> getTransferFunctionProvider() {
return transferFunct;
}
}