Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-05-09 01:49:06 +0000
committerAlena Laskavaia2010-05-09 01:49:06 +0000
commited2cdbc5298b94e93be824bc3dbe445d0fccfee0 (patch)
tree3236c6bae690c569e0c67f14da2a37790de40743 /codan/org.eclipse.cdt.codan.core.cxx
parent86647ac081be1de9b45fe7d219d12a6c74afb7e0 (diff)
downloadorg.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')
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java43
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/CxxModelsCache.java14
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))

Back to the top