diff options
author | Alena Laskavaia | 2010-05-09 01:49:06 +0000 |
---|---|---|
committer | Alena Laskavaia | 2010-05-09 01:49:06 +0000 |
commit | ed2cdbc5298b94e93be824bc3dbe445d0fccfee0 (patch) | |
tree | 3236c6bae690c569e0c67f14da2a37790de40743 /codan/org.eclipse.cdt.codan.core.cxx | |
parent | 86647ac081be1de9b45fe7d219d12a6c74afb7e0 (diff) | |
download | org.eclipse.cdt-ed2cdbc5298b94e93be824bc3dbe445d0fccfee0.tar.gz org.eclipse.cdt-ed2cdbc5298b94e93be824bc3dbe445d0fccfee0.tar.xz org.eclipse.cdt-ed2cdbc5298b94e93be824bc3dbe445d0fccfee0.zip |
Bug 311268 fixed some f.p. in return checker
Diffstat (limited to 'codan/org.eclipse.cdt.codan.core.cxx')
2 files changed, 54 insertions, 3 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 8f2809892a9..a78bae7858f 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 @@ -31,8 +31,10 @@ import org.eclipse.cdt.core.dom.ast.IASTContinueStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement; import org.eclipse.cdt.core.dom.ast.IASTDoStatement; +import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTForStatement; +import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTGotoStatement; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; @@ -43,6 +45,7 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemStatement; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; +import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; /** @@ -72,6 +75,7 @@ public class ControlFlowGraphBuilder { returnExit = (CxxExitNode) factory.createExitNode(null); returnExit.setStartNode(start); addOutgoing(last, returnExit); + exits.add(returnExit); } CxxControlFlowGraph graph = new CxxControlFlowGraph(start, exits); graph.setUnconnectedNodes(dead); @@ -94,6 +98,10 @@ public class ControlFlowGraphBuilder { } else if (body instanceof IASTExpressionStatement || body instanceof IASTDeclarationStatement || body instanceof IASTNullStatement) { + if (isThrowStatement(body) || isExitStatement(body)) { + CxxExitNode node = createExitNode(prev, body); + return node; + } CxxPlainNode node = factory.createPlainNode(body); addOutgoing(prev, node); return node; @@ -106,9 +114,7 @@ public class ControlFlowGraphBuilder { } else if (body instanceof IASTDoStatement) { return createDoWhile(prev, (IASTDoStatement) body); } else if (body instanceof IASTReturnStatement) { - CxxExitNode node = factory.createExitNode(body); - node.setStartNode(start); - addOutgoing(prev, node); + CxxExitNode node = createExitNode(prev, body); return node; } else if (body instanceof IASTBreakStatement) { if (outerBreak != null) @@ -161,6 +167,37 @@ public class ControlFlowGraphBuilder { } /** + * @param body + * @return + */ + private boolean isThrowStatement(IASTNode body) { + if (!(body instanceof IASTExpressionStatement)) return false; + IASTExpression expression = ((IASTExpressionStatement) body).getExpression(); + if (!(expression instanceof IASTUnaryExpression)) return false; + return ((IASTUnaryExpression) expression).getOperator() == IASTUnaryExpression.op_throw; + } + private boolean isExitStatement(IASTNode body) { + if (!(body instanceof IASTExpressionStatement)) return false; + IASTExpression expression = ((IASTExpressionStatement) body).getExpression(); + if (!(expression instanceof IASTFunctionCallExpression)) return false; + IASTExpression functionNameExpression = ((IASTFunctionCallExpression) expression).getFunctionNameExpression(); + return functionNameExpression.getRawSignature().equals("exit"); //$NON-NLS-1$ + } + + /** + * @param prev + * @param body + * @return + */ + protected CxxExitNode createExitNode(IBasicBlock prev, IASTNode body) { + CxxExitNode node = factory.createExitNode(body); + node.setStartNode(start); + addOutgoing(prev, node); + exits.add(node); + return node; + } + + /** * @param prev * @param labelName * @return diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/CxxModelsCache.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/CxxModelsCache.java index 14c397542f9..9ce71a22f34 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/CxxModelsCache.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/CxxModelsCache.java @@ -10,7 +10,12 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.cxx.model; +import java.util.WeakHashMap; + +import org.eclipse.cdt.codan.core.cxx.internal.model.cfg.CxxControlFlowGraph; +import org.eclipse.cdt.codan.core.model.cfg.IControlFlowGraph; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.CoreModel; @@ -27,6 +32,7 @@ public class CxxModelsCache { private IASTTranslationUnit ast; private ITranslationUnit tu; private IIndex index; + private WeakHashMap<IASTFunctionDefinition, IControlFlowGraph> cfgmap = new WeakHashMap<IASTFunctionDefinition, IControlFlowGraph>(0); private static CxxModelsCache instance = new CxxModelsCache(); @@ -34,12 +40,20 @@ public class CxxModelsCache { return instance; } + public synchronized IControlFlowGraph getControlFlowGraph(IASTFunctionDefinition func) { + IControlFlowGraph cfg = cfgmap.get(func); + if (cfg!=null) return cfg; + cfg = CxxControlFlowGraph.build(func); + cfgmap.put(func, cfg); + return cfg; + } public synchronized IASTTranslationUnit getAst(IFile file) throws CoreException, InterruptedException { if (file.equals(this.file)) { return ast; } + cfgmap.clear(); // create translation unit and access index ICElement celement = CoreModel.getDefault().create(file); if (!(celement instanceof ITranslationUnit)) |