Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2015-02-18 03:12:50 +0000
committerGerrit Code Review @ Eclipse.org2015-02-18 21:42:59 +0000
commit3cf5ec86eef49327bd52622b702ca65c6af68472 (patch)
treefc08486887f7ca6e4d75d0241c803febe12c2a68 /codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse
parent3edc86361c269ca44f7998e0087bff492687eb0c (diff)
downloadorg.eclipse.cdt-3cf5ec86eef49327bd52622b702ca65c6af68472.tar.gz
org.eclipse.cdt-3cf5ec86eef49327bd52622b702ca65c6af68472.tar.xz
org.eclipse.cdt-3cf5ec86eef49327bd52622b702ca65c6af68472.zip
Bug 327375 control flow graph regression - dead connector nodes
basically for the code like if (a) return 1; else return 2; a++; // this should be a dead code node but we don't check connector node of "if" and don't add it to dead nodes graph resulting it this code not being marked as dead, which can lead to false positives or false negatives for checkers that use that. Same apply for other control statements... Change-Id: Iafb4b48ca960f0ffab2c0265285a31cb08eb0d11
Diffstat (limited to 'codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse')
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java41
1 files changed, 30 insertions, 11 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 07aea511da1..8e3094593a7 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
@@ -312,16 +312,23 @@ public class ControlFlowGraphBuilder {
addOutgoing(ifNode, elseNode);
IBasicBlock els = createSubGraph(elseNode, body.getElseClause());
addJump(els, mergeNode);
+ fixConnector(mergeNode);
return mergeNode;
}
+ protected void fixConnector(IConnectorNode mergeNode) {
+ if (mergeNode.getIncomingSize()==0)
+ dead.add(mergeNode); // dead connector node
+ }
+
private IBasicBlock createSwitch(IBasicBlock prev, IASTSwitchStatement body) {
DecisionNode node = factory.createDecisionNode(body.getControllerExpression());
addOutgoing(prev, node);
- IConnectorNode conn = factory.createConnectorNode();
- node.setMergeNode(conn);
- createSwitchBody(node, conn, body.getBody());
- return conn;
+ IConnectorNode mergeNode = factory.createConnectorNode();
+ node.setMergeNode(mergeNode);
+ createSwitchBody(node, mergeNode, body.getBody());
+ fixConnector(mergeNode);
+ return mergeNode;
}
private void createSwitchBody(IDecisionNode switchNode, IConnectorNode mergeNode, IASTStatement body) {
@@ -380,9 +387,13 @@ public class ControlFlowGraphBuilder {
IConnectorNode savedBreak = outerBreak;
outerContinue = nContinue;
outerBreak = nBreak;
- IBasicBlock endBody = createSubGraph(loopStart, forNode.getBody());
- outerContinue = savedContinue;
- outerBreak = savedBreak;
+ IBasicBlock endBody = decision;
+ try {
+ endBody = createSubGraph(loopStart, forNode.getBody());
+ } finally {
+ outerContinue = savedContinue;
+ outerBreak = savedBreak;
+ }
// inc
IPlainNode inc = factory.createPlainNode(forNode.getIterationExpression());
addOutgoing(endBody, nContinue);
@@ -393,6 +404,7 @@ public class ControlFlowGraphBuilder {
IBranchNode loopEnd = factory.createBranchNode(IBranchNode.ELSE);
addOutgoing(decision, loopEnd);
addJump(loopEnd, nBreak);
+ fixConnector(nBreak);
return nBreak;
}
@@ -432,6 +444,7 @@ public class ControlFlowGraphBuilder {
IBranchNode loopEnd = factory.createBranchNode(IBranchNode.ELSE);
addOutgoing(decision, loopEnd);
addJump(loopEnd, nBreak);
+ fixConnector(nBreak);
return nBreak;
}
@@ -453,16 +466,21 @@ public class ControlFlowGraphBuilder {
IConnectorNode savedBreak = outerBreak;
outerContinue = nContinue;
outerBreak = nBreak;
- IBasicBlock endBody = createSubGraph(loopStart, body.getBody());
- // Restore
- outerContinue = savedContinue;
- outerBreak = savedBreak;
+ IBasicBlock endBody = decision;
+ try {
+ endBody = createSubGraph(loopStart, body.getBody());
+ } finally {
+ // Restore
+ outerContinue = savedContinue;
+ outerBreak = savedBreak;
+ }
// Backward jump
addJump(endBody, nContinue, true);
// Connect with else branch
IBranchNode loopEnd = factory.createBranchNode(IBranchNode.ELSE);
addOutgoing(decision, loopEnd);
addJump(loopEnd, nBreak);
+ fixConnector(nBreak);
return nBreak;
}
@@ -500,6 +518,7 @@ public class ControlFlowGraphBuilder {
// Add break connector
decision.setMergeNode(nBreak);
addJump(loopEnd, nBreak);
+ fixConnector(nBreak);
return nBreak;
}

Back to the top