From c8e082274ba0270aa5a921f8bd5ade2abdfda314 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 23 Jul 2015 17:38:10 +0300 Subject: Fix some false positive with calling function. --- src/analysis/expression.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/analysis') diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 3376d81..245c07d 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -62,6 +62,7 @@ #include "nodes/type/array_type.h" #include "nodes/type/method_type.h" +#include "nodes/type/reference_type.h" #include @@ -804,14 +805,14 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) wo.stopWalking = true; return; } - if (declNode->functionType == FUNCTION_TYPE) + if (skipNop(declNode->functionType) == FUNCTION_TYPE) { enableCheck = false; } } } } - else if (node->function == VAR_DECL) + else if (function == VAR_DECL) { enableCheck = false; } @@ -821,7 +822,8 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) { ArrayRefNode *arrRef = static_cast(function); if (!arrRef->args.empty() && - (arrRef->args[0] == COMPONENT_REF || VAR_DECL)) + (skipNop(arrRef->args[0]) == COMPONENT_REF || + skipNop(arrRef->args[0]) == VAR_DECL)) { function = arrRef->args[0]; } @@ -830,7 +832,18 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) { ConvertExprNode *convExpr = static_cast(function); if (!convExpr->args.empty()) - function = convExpr->args[0]; + function = skipNop(convExpr->args[0]); + if (function == PARM_DECL) + { + ParmDeclNode *parm = static_cast(function); + if (skipNop(parm->declType) == REFERENCE_TYPE) + { + ReferenceTypeNode *ref = static_cast( + skipNop(parm->declType)); + if (ref->nestedType == FUNCTION_TYPE) + enableCheck = false; + } + } } reportParmDeclNullPointer(node, function, wi); if (!getVariableName(function).empty()) @@ -855,6 +868,7 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) } else { + reportParmDeclLeftNullPointer(node, node2, wi); if (isIn(param, nullAttrs)) reportParmDeclAttrNullPointer(node, node2, wi); } -- cgit v1.2.3-70-g09d2