summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.extension
diff options
context:
space:
mode:
authorElliott Baron <ebaron@fedoraproject.org>2009-10-31 12:53:00 -0400
committerElliott Baron <ebaron@fedoraproject.org>2009-10-31 12:53:00 -0400
commitf4fd87f6b05de1a67c5d2d09f1813ddce6de4879 (patch)
tree2b2478caf6e34b26d1c8a6d99744b6f4e6ecc38a /org.eclipse.cdt.codan.extension
parent8c3cd18a05d15f3c9b13ec87250decd318665f0e (diff)
downloadcodan-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.
Diffstat (limited to 'org.eclipse.cdt.codan.extension')
-rw-r--r--org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/CloseOpenedFilesChecker.java19
-rw-r--r--org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/FunctionNameParser.java36
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;
}
}