From f4fd87f6b05de1a67c5d2d09f1813ddce6de4879 Mon Sep 17 00:00:00 2001 From: Elliott Baron Date: Sat, 31 Oct 2009 12:53:00 -0400 Subject: 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. --- .../checkers/CloseOpenedFilesChecker.java | 19 +++++------- .../extension/checkers/FunctionNameParser.java | 36 +++++++++++++++++++--- 2 files changed, 38 insertions(+), 17 deletions(-) (limited to 'org.eclipse.cdt.codan.extension') 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 flowMerge(IBlock blk, Set ss1, Set ss2) { - ss1.addAll(ss2); - return group(ss1); + Set ret = new HashSet(); + ret.addAll(ss1); + ret.addAll(ss2); + return group(ret); } private Set flowBranch(IBlock blk, Set ss, boolean value) { @@ -328,12 +330,7 @@ public class CloseOpenedFilesChecker extends AbstractIndexAstChecker { Set 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; } } -- cgit