diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-27 21:07:04 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-27 21:07:04 +0300 |
commit | fc1658509ff1e1b5c967f0805a6d6e0e1b197a06 (patch) | |
tree | 65c0113c35dc8b30c5277b2b78944b5040f921d1 /src | |
parent | f8e82463820924320ca302434c702b822d2b4ce1 (diff) | |
download | paranucker-fc1658509ff1e1b5c967f0805a6d6e0e1b197a06.tar.gz paranucker-fc1658509ff1e1b5c967f0805a6d6e0e1b197a06.tar.bz2 paranucker-fc1658509ff1e1b5c967f0805a6d6e0e1b197a06.tar.xz paranucker-fc1658509ff1e1b5c967f0805a6d6e0e1b197a06.zip |
Check function parameters what must be non null
and report if variable must be checked for null
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/analysis.cpp | 37 | ||||
-rw-r--r-- | src/analysis/analysis.h | 4 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 16 | ||||
-rw-r--r-- | src/analysis/function.h | 5 |
4 files changed, 62 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index b246eba..490bb66 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -257,6 +257,43 @@ void reportParmDeclNullPointer(Node *mainNode, } } +void reportPossibleNullPointer(Node *node, + const std::string &label) +{ + Log::warn(findBackLocation(node), + "warning: possible null argument '%s' where non-null required", + label); +} + +void reportParmDeclAttrNullPointer(Node *mainNode, + Node *node, + const WalkItem &wi) +{ + node = skipNop(node); + if (node) + { + if (!node->label.empty()) + { + if (node == PARM_DECL) + { + if (wi.checkNullVars.find(node->label) != wi.checkNullVars.end()) + reportPossibleNullPointer(mainNode, node->label); + } + else if (node == VAR_DECL) + { + if (wi.checkNullVars.find(node->label) != wi.checkNullVars.end()) + reportPossibleNullPointer(mainNode, node->label); + } + } + else if (node == COMPONENT_REF) + { + std::string var = getComponentRefVariable(node); + if (wi.checkNullVars.find(var) != wi.checkNullVars.end()) + reportPossibleNullPointer(mainNode, node->label); + } + } +} + // skip all child nodes and return non nop child Node *skipNop(Node *node) { diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h index cc0763d..b371ab3 100644 --- a/src/analysis/analysis.h +++ b/src/analysis/analysis.h @@ -42,6 +42,10 @@ namespace Analysis Node *node, const WalkItem &wi); + void reportParmDeclAttrNullPointer(Node *mainNode, + Node *node, + const WalkItem &wi); + bool checkForReport(Node *node, const WalkItem &wi); diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 1711de2..c607e9e 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -23,6 +23,7 @@ #include "logger.h" #include "analysis/analysis.h" +#include "analysis/function.h" #include "analysis/statement.h" #include "analysis/walkitem.h" @@ -457,6 +458,7 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) Log::dumpWI(node, "wo chain ", wo2); wo2 = wo; bool enableCheck(true); + std::set<int> nullAttrs; if (node->function) { walkTree(node->function, wi, wo2); @@ -470,6 +472,7 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) Node *decl = skipNop(addrNode->args[0]); if (decl == FUNCTION_DECL) { + function = decl; FunctionDeclNode *declNode = static_cast<FunctionDeclNode*>( decl); if (declNode->functionType == FUNCTION_TYPE) @@ -504,7 +507,14 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) if (!getVariableName(function).empty()) enableCheck = false; } + if (function == FUNCTION_DECL) + { + getFunctionParamsNonNullAttributes( + static_cast<FunctionDeclNode*>(function), + nullAttrs); + } } + int param = 1; FOR_EACH (std::vector<Node*>::const_iterator, it, node->args) { wo2 = wo; @@ -514,8 +524,14 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) reportParmDeclNullPointer(node, node2, wi); enableCheck = false; } + else + { + if (nullAttrs.find(param) != nullAttrs.end()) + reportParmDeclAttrNullPointer(node, node2, wi); + } walkTree(node2, wi, wo2); Log::dumpWI(node, "wo arg ", wo2); + param ++; } wo.stopWalking = true; } diff --git a/src/analysis/function.h b/src/analysis/function.h index ad85bfa..f7e0a66 100644 --- a/src/analysis/function.h +++ b/src/analysis/function.h @@ -22,6 +22,8 @@ #include "includes.h" +#include <set> + struct FunctionDeclNode; struct TreeListNode; struct TypeNode; @@ -33,6 +35,9 @@ namespace Analysis void getFunctionArgTypes(FunctionDeclNode *node, std::vector<TypeNode*> &arr); + + void getFunctionParamsNonNullAttributes(FunctionDeclNode *node, + std::set<int> &arr); } #endif // ANALYSIS_FUNCTION_H |