diff options
author | Elliott Baron <ebaron@fedoraproject.org> | 2009-10-31 12:53:00 -0400 |
---|---|---|
committer | Elliott Baron <ebaron@fedoraproject.org> | 2009-10-31 12:53:00 -0400 |
commit | f4fd87f6b05de1a67c5d2d09f1813ddce6de4879 (patch) | |
tree | 2b2478caf6e34b26d1c8a6d99744b6f4e6ecc38a | |
parent | 8c3cd18a05d15f3c9b13ec87250decd318665f0e (diff) | |
download | codan-f4fd87f6b05de1a67c5d2d09f1813ddce6de4879.tar.gz codan-f4fd87f6b05de1a67c5d2d09f1813ddce6de4879.tar.xz codan-f4fd87f6b05de1a67c5d2d09f1813ddce6de4879.zip |
Fixed handling of nested if statements.
* org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java: Fixed flowMerge to not modify argument,
allow duplicates in worklist - some blocks need to be processed more than once.
* org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java: Unused imports.
2 files changed, 38 insertions, 17 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 a38ef13..5ea8e79 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 @@ -183,8 +183,10 @@ public class CloseOpenedFilesChecker extends AbstractIndexAstChecker { private Set<SymbolicState> flowMerge(IBlock blk, Set<SymbolicState> ss1, Set<SymbolicState> ss2) { - ss1.addAll(ss2); - return group(ss1); + Set<SymbolicState> ret = new HashSet<SymbolicState>(); + ret.addAll(ss1); + ret.addAll(ss2); + return group(ret); } private Set<SymbolicState> flowBranch(IBlock blk, Set<SymbolicState> ss, boolean value) { @@ -328,12 +330,7 @@ public class CloseOpenedFilesChecker extends AbstractIndexAstChecker { Set<SymbolicState> ss) { if (!edgeInfo.get(edge).equals(ss)) { edgeInfo.put(edge, ss); - - // No duplicates - IBlock next = edge.getTo(); - if (!worklist.contains(next)) { - worklist.add(next); - } + worklist.add(edge.getTo()); } } @@ -378,14 +375,12 @@ public class CloseOpenedFilesChecker extends AbstractIndexAstChecker { } protected boolean containsOpen(IASTNode node) { - // TODO Examine more than just name - FunctionNameParser parser = new FunctionNameParser(node, OPEN); + FunctionNameParser parser = new FunctionNameParser(node, OPEN, new String[] { "const char *", "int" }); return parser.matches(); } protected boolean containsClose(IASTNode node) { - // TODO Examine more than just name - FunctionNameParser parser = new FunctionNameParser(node, CLOSE); + FunctionNameParser parser = new FunctionNameParser(node, CLOSE, new String[] { "int" }); return parser.matches(); } diff --git a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java index bf87ec1..22f4287 100644 --- a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java +++ b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java @@ -10,20 +10,28 @@ *******************************************************************************/ package org.eclipse.cdt.codan.extension.checkers; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IFunction; +import org.eclipse.cdt.core.dom.ast.IParameter; +import org.eclipse.cdt.core.dom.ast.IType; public class FunctionNameParser { private IASTNode node; private String funcName; + private String[] paramTypes; - public FunctionNameParser(IASTNode node, String funcName) { + public FunctionNameParser(IASTNode node, String funcName, String[] paramTypes) { this.node = node; this.funcName = funcName; + this.paramTypes = paramTypes; } public boolean matches() { @@ -43,10 +51,28 @@ public class FunctionNameParser { public int visit(IASTExpression expr) { if (expr instanceof IASTFunctionCallExpression) { IASTFunctionCallExpression callExpression = (IASTFunctionCallExpression) expr; - IASTExpression funcName = callExpression.getFunctionNameExpression(); - if (funcName instanceof IASTIdExpression) { - IASTName name = ((IASTIdExpression) funcName).getName(); - result = name.toString().equals(FunctionNameParser.this.funcName); + IASTExpression funcExpr = callExpression.getFunctionNameExpression(); + if (funcExpr instanceof IASTIdExpression) { + IASTName name = ((IASTIdExpression) funcExpr).getName(); + IBinding binding = name.resolveBinding(); + if (binding instanceof IFunction) { + IFunction fun = (IFunction) binding; + String funName = fun.getName(); + if (funcName.equals(funName)) { + try { + IParameter[] params = fun.getParameters(); + if (paramTypes.length == params.length && paramTypes.length > 0) { + result = true; + for (int i = 0; i < params.length; i++) { + IType type = params[i].getType(); + result &= paramTypes[i].equals(ASTTypeUtil.getType(type)); + } + } + } catch (DOMException e) { + e.printStackTrace(); + } + } + } return PROCESS_SKIP; } } |