summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-24 17:08:34 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-24 17:08:34 +0300
commitc45f9b72e5182386b723f2d44a1417ccb69a20c8 (patch)
treefd40171102a2a4f941de1752db8d4d6d70b31737
parent5872f7799cc09b33dc1f0101114cad2cdb1784b7 (diff)
downloadparanucker-c45f9b72e5182386b723f2d44a1417ccb69a20c8.tar.gz
paranucker-c45f9b72e5182386b723f2d44a1417ccb69a20c8.tar.bz2
paranucker-c45f9b72e5182386b723f2d44a1417ccb69a20c8.tar.xz
paranucker-c45f9b72e5182386b723f2d44a1417ccb69a20c8.zip
Add analysis for node CLEANUP_POINT_EXPR.
This allow fix some false positives.
-rw-r--r--src/analysis/analysis.cpp4
-rw-r--r--src/analysis/expression.cpp16
-rw-r--r--src/analysis/expression.h3
3 files changed, 23 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index e4e789f..d17a46a 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -36,6 +36,7 @@
#include "nodes/expr/bind_expr.h"
#include "nodes/expr/compound_expr.h"
#include "nodes/expr/call_expr.h"
+#include "nodes/expr/cleanuppoint_expr.h"
#include "nodes/expr/cond_expr.h"
#include "nodes/expr/decl_expr.h"
#include "nodes/expr/eq_expr.h"
@@ -335,6 +336,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
case CALL_EXPR:
analyseCallExpr(static_cast<CallExprNode*>(node), wi2, wo);
break;
+ case CLEANUP_POINT_EXPR:
+ analyseCleanupPointExpr(static_cast<CleanupPointExprNode*>(node), wi2, wo);
+ break;
case COND_EXPR:
analyseCondExpr(static_cast<CondExprNode*>(node), wi2, wo);
break;
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 13911de..7cab3a0 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -29,6 +29,7 @@
#include "nodes/expr/addr_expr.h"
#include "nodes/expr/bind_expr.h"
#include "nodes/expr/call_expr.h"
+#include "nodes/expr/cleanuppoint_expr.h"
#include "nodes/expr/compound_expr.h"
#include "nodes/expr/cond_expr.h"
#include "nodes/expr/decl_expr.h"
@@ -436,4 +437,19 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo)
wo.stopWalking = true;
}
+void analyseCleanupPointExpr(CleanupPointExprNode* node, const WalkItem &wi, WalkItem &wo)
+{
+ WalkItem wo2 = wo;
+ FOR_EACH (std::vector<Node*>::const_iterator, it, node->args)
+ {
+ wo2 = wo;
+ Node *node2 = skipNop(*it);
+ reportParmDeclNullPointer(node, node2, wi);
+ walkTree(node2, wi, wo2);
+ Log::dumpWI(node, "wo arg ", wo2);
+ }
+ wo = wo2;
+ wo.stopWalking = true;
+}
+
}
diff --git a/src/analysis/expression.h b/src/analysis/expression.h
index b94e625..3085c40 100644
--- a/src/analysis/expression.h
+++ b/src/analysis/expression.h
@@ -25,6 +25,7 @@
struct AddrExprNode;
struct BindExprNode;
struct CallExprNode;
+struct CleanupPointExprNode;
struct CompoundExprNode;
struct CondExprNode;
struct DeclExprNode;
@@ -50,6 +51,8 @@ namespace Analysis
void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo);
+ void analyseCleanupPointExpr(CleanupPointExprNode* node, const WalkItem &wi, WalkItem &wo);
+
void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo);
void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo);