diff options
author | Alena Laskavaia | 2015-02-18 03:12:50 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2015-02-18 21:42:59 +0000 |
commit | 3cf5ec86eef49327bd52622b702ca65c6af68472 (patch) | |
tree | fc08486887f7ca6e4d75d0241c803febe12c2a68 /codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse | |
parent | 3edc86361c269ca44f7998e0087bff492687eb0c (diff) | |
download | org.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.java | 41 |
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; } |