WALA/com.ibm.wala.core.tests/src/com/ibm/wala/core/tests/ir/CFGSanitizerTest.java

84 lines
3.3 KiB
Java

/*******************************************************************************
* Copyright (c) 2002 - 2006 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.core.tests.ir;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
import com.ibm.wala.cfg.CFGSanitizer;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.tests.util.WalaTestCase;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.impl.Everywhere;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.summaries.MethodSummary;
import com.ibm.wala.ipa.summaries.SummarizedMethod;
import com.ibm.wala.ipa.summaries.XMLMethodSummaryReader;
import com.ibm.wala.ssa.IR;
import com.ibm.wala.ssa.ISSABasicBlock;
import com.ibm.wala.ssa.SSACFG.BasicBlock;
import com.ibm.wala.types.MethodReference;
import com.ibm.wala.util.WalaException;
import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.graph.Graph;
import com.ibm.wala.util.io.FileProvider;
/**
* Test integrity of CFGs
*/
public class CFGSanitizerTest extends WalaTestCase {
/**
* check that for all synthetic methods coming from the native specifications, the exit block is not disconnected from the rest of
* the sanitized graph
*
* @throws IOException
* @throws IllegalArgumentException
* @throws WalaException
*/
@Test
public void testSyntheticEdgeToExit() throws IOException, IllegalArgumentException, WalaException {
AnalysisScope scope = AnalysisScopeReader.makePrimordialScope((new FileProvider()).getFile(CallGraphTestUtil.REGRESSION_EXCLUSIONS));
ClassHierarchy cha = ClassHierarchy.make(scope);
ClassLoader cl = CFGSanitizerTest.class.getClassLoader();
InputStream s = cl.getResourceAsStream("natives.xml");
XMLMethodSummaryReader summary = new XMLMethodSummaryReader(s, scope);
AnalysisOptions options = new AnalysisOptions(scope, null);
Map<MethodReference, MethodSummary> summaries = summary.getSummaries();
for (MethodReference mr : summaries.keySet()) {
IMethod m = cha.resolveMethod(mr);
if (m == null) {
continue;
}
System.out.println(m.getSignature());
MethodSummary methodSummary = summaries.get(mr);
SummarizedMethod summMethod = new SummarizedMethod(mr, methodSummary, m.getDeclaringClass());
IR ir = summMethod.makeIR(Everywhere.EVERYWHERE, options.getSSAOptions());
System.out.println(ir);
Graph<ISSABasicBlock> graph = CFGSanitizer.sanitize(ir, cha);
System.out.println(graph);
BasicBlock exit = ir.getControlFlowGraph().exit();
if (!exit.equals(ir.getControlFlowGraph().entry())) {
Assert.assertTrue(graph.getPredNodeCount(exit) > 0);
}
}
}
}