diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-22 14:11:27 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-22 14:11:27 +0300 |
commit | feba614e7412bdc2d6d186d232e90510d77e96d6 (patch) | |
tree | 153cf66628ef4c1125bfd3641a1d2e5e04eae387 | |
parent | f4ef6ba6ea8bb399a68af9ce6308750f9c85fb81 (diff) | |
download | paranucker-feba614e7412bdc2d6d186d232e90510d77e96d6.tar.gz paranucker-feba614e7412bdc2d6d186d232e90510d77e96d6.tar.bz2 paranucker-feba614e7412bdc2d6d186d232e90510d77e96d6.tar.xz paranucker-feba614e7412bdc2d6d186d232e90510d77e96d6.zip |
Allow detect some kind of empty pointer variables or if assigned unknown value.
-rw-r--r-- | src/analysis/expression.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index e6aa4fa..3877d68 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -153,11 +153,18 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo) std::string var1 = getVariableName(arg); std::string var2 = getVariableName(node->args[1]); - if (arg == INDIRECT_REF) + Node *arg0 = arg; + if (arg == COMPONENT_REF) + { + ComponentRefNode *comp = static_cast<ComponentRefNode*>(arg); + if (skipNop(comp->object) == INDIRECT_REF) + arg0 = skipNop(comp->object); + } + if (arg0 == INDIRECT_REF) { // var2 not found in known checking pointer reportParmDeclNullPointer(node, - static_cast<IndirectRefNode*>(arg)->ref, + static_cast<IndirectRefNode*>(arg0)->ref, wi); if (isNotIn(var2, wi.needCheckNullVars) && @@ -786,14 +793,14 @@ bool handleSetVarToFunction(const std::string &var, if (node2 == ADDR_EXPR) { AddrExprNode *addr = static_cast<AddrExprNode*>(node2); - if (!addr->args.empty() && addr->args[0] == VAR_DECL) + if (!addr->args.empty() && skipNop(addr->args[0]) == VAR_DECL) { - VarDeclNode *varDecl = static_cast<VarDeclNode*>(addr->args[0]); - if (varDecl->varType != POINTER_TYPE) - { + VarDeclNode *varDecl = static_cast<VarDeclNode*>(skipNop(addr->args[0])); + if (skipNop(varDecl->varType) != POINTER_TYPE) addNonNullVar(wo, var); - return true; - } + else + addUnknownVar(wo, var); + return true; } } @@ -888,9 +895,10 @@ void handleSetVar(Node *node1, } else { - if (isNotIn(var2, wi.knownVars)) - return; - addLinkedVar(wo, var2, var1); + if (isIn(var2, wi.knownVars)) + addLinkedVar(wo, var2, var1); + else + addUnknownVar(wo, var1); } } |