summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java
diff options
context:
space:
mode:
authorElliott Baron <ebaron@fedoraproject.org>2009-11-08 21:01:52 -0500
committerElliott Baron <ebaron@fedoraproject.org>2009-11-08 21:01:52 -0500
commit4e991b89471d65f4f02e1ad54f2b85759ad80586 (patch)
tree6fc90e471e6cdeb5a22af7117e65f5bf6c6ea9fa /org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java
parent07719f845f1e6045ed5c1553eafa9c632e53e8bf (diff)
downloadcodan-4e991b89471d65f4f02e1ad54f2b85759ad80586.tar.gz
codan-4e991b89471d65f4f02e1ad54f2b85759ad80586.tar.xz
codan-4e991b89471d65f4f02e1ad54f2b85759ad80586.zip
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().
Diffstat (limited to 'org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java')
-rw-r--r--org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java138
1 files changed, 6 insertions, 132 deletions
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<PropertyState> getPropertyStates() {
- Set<PropertyState> states = new HashSet<PropertyState>();
- 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.";