diff options
author | Alena Laskavaia | 2010-06-04 03:03:37 +0000 |
---|---|---|
committer | Alena Laskavaia | 2010-06-04 03:03:37 +0000 |
commit | 652e118d0eaae77287230827307283099bdfe595 (patch) | |
tree | 4369f95d22f74e759dbb18571d92401d6183e611 /codan/org.eclipse.cdt.codan.checkers | |
parent | 21c368302810550a102eab75ce1ff75c54bc5b13 (diff) | |
download | org.eclipse.cdt-652e118d0eaae77287230827307283099bdfe595.tar.gz org.eclipse.cdt-652e118d0eaae77287230827307283099bdfe595.tar.xz org.eclipse.cdt-652e118d0eaae77287230827307283099bdfe595.zip |
Bug 315518 - fixed case where checker would report return with value while expression is void
Diffstat (limited to 'codan/org.eclipse.cdt.codan.checkers')
-rw-r--r-- | codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java index 2f1d4beab57..e88c86d5f9b 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ReturnChecker.java @@ -20,6 +20,7 @@ import org.eclipse.cdt.codan.core.model.cfg.ICfgData; import org.eclipse.cdt.codan.core.model.cfg.IControlFlowGraph; import org.eclipse.cdt.codan.core.model.cfg.IExitNode; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; @@ -27,6 +28,8 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IBasicType; +import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; /** @@ -54,10 +57,13 @@ public class ReturnChecker extends AbstractAstFunctionChecker { this.hasret = false; } public int visit(IASTDeclaration element) { - return PROCESS_SKIP; // skip inner functions + if (element!=func) + return PROCESS_SKIP; // skip inner functions + return PROCESS_CONTINUE; } public int visit(IASTStatement stmt) { if (stmt instanceof IASTReturnStatement) { + hasret = true; IASTReturnStatement ret = (IASTReturnStatement) stmt; if (!isVoid(func)) { if (checkImplicitReturn(RET_NO_VALUE_ID) @@ -66,14 +72,19 @@ public class ReturnChecker extends AbstractAstFunctionChecker { reportProblem(RET_NO_VALUE_ID, ret); } } else { - if (ret.getReturnValue() != null) + if (ret.getReturnValue() != null) { + IType type = ret.getReturnValue().getExpressionType(); + if (isVoid(type)) + return PROCESS_SKIP; reportProblem(RET_ERR_VALUE_ID, ret.getReturnValue()); + } } - hasret = true; + return PROCESS_SKIP; } return PROCESS_CONTINUE; } + } /* @@ -148,7 +159,24 @@ public class ReturnChecker extends AbstractAstFunctionChecker { } return false; } - + /** + * check if type if void + * (uses deprecated API for compatibility with 6.0) + * @param type + * @throws DOMException + */ + @SuppressWarnings("deprecation") + public boolean isVoid(IType type) { + if (type instanceof IBasicType) { + try { + if (((IBasicType) type).getType()==IBasicType.t_void) + return true; + } catch (DOMException e) { + return false; + } + } + return false; + } /** * @param func * @return |