Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2011-05-01 21:14:42 +0000
committerAlena Laskavaia2011-05-01 21:14:42 +0000
commita63a62bc4fbe55ac8c5b7a4c4dc4398a5f25c58f (patch)
treec6382fb0cbd7ca89a4795357c045cab3e29afbae
parenta0ff5b6b4f71587ceec32644b32288a584617bf9 (diff)
downloadorg.eclipse.cdt-a63a62bc4fbe55ac8c5b7a4c4dc4398a5f25c58f.tar.gz
org.eclipse.cdt-a63a62bc4fbe55ac8c5b7a4c4dc4398a5f25c58f.tar.xz
org.eclipse.cdt-a63a62bc4fbe55ac8c5b7a4c4dc4398a5f25c58f.zip
Bug 343767 - [fp] 'No return' warning when return in both if and else
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java33
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java10
2 files changed, 39 insertions, 4 deletions
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
index c5f9bd9d847..22076c92a50 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
@@ -77,14 +77,14 @@ public class ControlFlowGraphBuilder {
exits = new ArrayList<IExitNode>();
dead = new ArrayList<IBasicBlock>();
IBasicBlock last = createSubGraph(start, body);
- if (!(last instanceof IExitNode)) {
- returnExit = (CxxExitNode) factory.createExitNode(null);
+ if (!(last instanceof IExitNode) && !deadConnector(last)) {
+ returnExit = factory.createExitNode(null);
returnExit.setStartNode(start);
addOutgoing(last, returnExit);
exits.add(returnExit);
if (dead.size() > 0) {
- for (Iterator iterator = dead.iterator(); iterator.hasNext();) {
- IBasicBlock ds = (IBasicBlock) iterator.next();
+ for (Iterator<IBasicBlock> iterator = dead.iterator(); iterator.hasNext();) {
+ IBasicBlock ds = iterator.next();
IBasicBlock dl = findLast(ds);
if (dl != null && dl.getOutgoingSize() == 0 && dl != returnExit) {
((AbstractBasicBlock) dl).addOutgoing(returnExit);
@@ -97,6 +97,31 @@ public class ControlFlowGraphBuilder {
return graph;
}
+ /**
+ * @param last
+ * @return
+ */
+ private boolean deadConnector(IBasicBlock conn) {
+ if (conn instanceof IJumpNode || conn instanceof IConnectorNode) {
+ if (conn.getIncomingSize() == 0) {
+ return true;
+ }
+ if (conn instanceof IJumpNode) {
+ IJumpNode jm = (IJumpNode) conn;
+ if (jm.isBackwardArc())
+ return false;
+ }
+ IBasicBlock[] conns = conn.getIncomingNodes();
+ for (int i = 0; i < conns.length; i++) {
+ IBasicBlock bb = conns[i];
+ if (!deadConnector(bb))
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
public IBasicBlock findLast(IBasicBlock node) {
if (node instanceof IJumpNode)
return null;
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java
index d9174dd00eb..9169ac64a96 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ReturnCheckerTest.java
@@ -245,4 +245,14 @@ public class ReturnCheckerTest extends CheckerTestCase {
loadCodeAndRunCpp(getAboveComment());
checkNoErrors();
}
+ //int bar(int foo)
+ //{
+ // while(foo) {
+ // return 0;
+ // }
+ //}
+ public void testWhile() {
+ loadCodeAndRunCpp(getAboveComment());
+ checkErrorLine(1);
+ }
} \ No newline at end of file

Back to the top