Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-06-04 03:03:37 +0000
committerAlena Laskavaia2010-06-04 03:03:37 +0000
commit652e118d0eaae77287230827307283099bdfe595 (patch)
tree4369f95d22f74e759dbb18571d92401d6183e611 /codan/org.eclipse.cdt.codan.checkers
parent21c368302810550a102eab75ce1ff75c54bc5b13 (diff)
downloadorg.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.java36
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

Back to the top