From 4e991b89471d65f4f02e1ad54f2b85759ad80586 Mon Sep 17 00:00:00 2001 From: Elliott Baron Date: Sun, 8 Nov 2009 21:01:52 -0500 Subject: Added fopen/fclose checker. Created abstract open/close checker. * org.eclipse.cdt.codan.extension/plugin.xml: Added fopen/fclose checker. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/AbstractOpenCloseChecker.java: New file. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java: Abstracted most code. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FOpenFCloseChecker.java: New file. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java: Pass normalize = false to ASTTypeUtil.getType(). --- .../checkers/CloseOpenedFilesChecker.java | 138 +-------------------- 1 file changed, 6 insertions(+), 132 deletions(-) (limited to 'org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java') diff --git a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java index d60889a..2117109 100644 --- a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java +++ b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java @@ -10,157 +10,31 @@ *******************************************************************************/ package org.eclipse.cdt.codan.extension.checkers; -import java.io.File; -import java.net.URI; import java.text.MessageFormat; -import java.util.HashSet; -import java.util.Set; -import org.eclipse.cdt.codan.core.model.AbstractIndexAstChecker; import org.eclipse.cdt.codan.extension.Activator; import org.eclipse.cdt.codan.extension.ExecutionState; -import org.eclipse.cdt.codan.extension.IPropertyFSM; -import org.eclipse.cdt.codan.extension.PropertySimulator; -import org.eclipse.cdt.codan.extension.PropertyState; -import org.eclipse.cdt.codan.extension.SymbolicState; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTStatement; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator; -import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraph; -import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraphNode; -import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.IControlFlowGraph; -import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.impl.ControlFlowGraph; -public class CloseOpenedFilesChecker extends AbstractIndexAstChecker { - private static final String ERR_ID = Activator.PLUGIN_ID + ".CloseOpenedFilesProblem"; +public class CloseOpenedFilesChecker extends AbstractOpenCloseChecker { + private static final String ERR_ID = Activator.PLUGIN_ID + ".OpenCloseFilesProblem"; private static final String OPEN = "open"; private static final String CLOSE = "close"; - private IPropertyFSM fsm; - - // Property FSM states - private PropertyState uninit; - private PropertyState error; - private PropertyState opened; - - public CloseOpenedFilesChecker() { - fsm = initFSM(); - } - - public void processAst(IASTTranslationUnit ast) { - GraphCreator creator = new GraphCreator(); - - // Retrieve resource corresponding to this translation unit - String path = ast.getFilePath(); - URI fileURI = new File(path).toURI(); - IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot(); - IResource[] resources = wsRoot.findFilesForLocationURI(fileURI); - if (resources != null && resources.length > 0) { - IProject proj = resources[0].getProject(); - - // Create call graph for project - ICallGraph cg = creator.createCallGraph(proj); - creator.computeCallGraph(cg); - - // Create control flow graph for each function - for (ICallGraphNode node : cg.getAllNodes()) { - IASTStatement fnBody = node.getFuncDef().getBody(); - IControlFlowGraph cfg = new ControlFlowGraph(fnBody); - cfg.buildCFG(); - - // Search for error states using property simulation algorithm - PropertySimulator sim = new PropertySimulator(cfg, fsm); - - // Check if the exit edge of the CFG contains an error state - for (SymbolicState s : sim.getEndStates()) { - if (s.getPropertyStates().contains(error)) { - // Report problems - for (IASTNode errorNode : s.getErrorCauses()) { - reportProblem(errorNode, s.getExecutionState()); - } - } - } - } - } - } - - private IPropertyFSM initFSM() { - uninit = new PropertyState("$u") { - @Override - public PropertyState transition(IASTNode node) { - PropertyState dest = uninit; - if (containsOpen(node)) { - dest = opened; - } - else if (containsClose(node)) { - dest = error; - } - return dest; - } - }; - - opened = new PropertyState("o") { - @Override - public PropertyState transition(IASTNode node) { - PropertyState dest = opened; - if (containsOpen(node)) { - dest = error; - } - if (containsClose(node)) { - dest = uninit; - } - return dest; - } - }; - - error = new PropertyState("$e") { - - @Override - public PropertyState transition(IASTNode node) { - return error; - } - }; - - return new IPropertyFSM() { - - @Override - public PropertyState getUninitState() { - return uninit; - } - - @Override - public Set getPropertyStates() { - Set states = new HashSet(); - states.add(uninit); - states.add(opened); - states.add(error); - return states; - } - - @Override - public PropertyState getErrorState() { - return error; - } - }; - } - + @Override protected boolean containsOpen(IASTNode node) { FunctionNameParser parser = new FunctionNameParser(node, OPEN, new String[] { "const char *", "int" }); return parser.matches(); } + @Override protected boolean containsClose(IASTNode node) { FunctionNameParser parser = new FunctionNameParser(node, CLOSE, new String[] { "int" }); return parser.matches(); } - - private void reportProblem(IASTNode node, ExecutionState condition) { + + protected void reportProblem(IASTNode node, ExecutionState condition) { String message; if (condition.isTop()) { message = "Improper use of open/close."; -- cgit