diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-19 20:27:28 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-19 20:27:28 +0300 |
commit | 4307905ef2ea753cb080b12c9a3ca70be22f40e5 (patch) | |
tree | 6d9750711f329cb062596de715b6dd0b0e68b131 /src | |
parent | aaa7e95066c8144d5df0ccab7fa2ca334c8512e5 (diff) | |
download | paranucker-4307905ef2ea753cb080b12c9a3ca70be22f40e5.tar.gz paranucker-4307905ef2ea753cb080b12c9a3ca70be22f40e5.tar.bz2 paranucker-4307905ef2ea753cb080b12c9a3ca70be22f40e5.tar.xz paranucker-4307905ef2ea753cb080b12c9a3ca70be22f40e5.zip |
Handle situation like this: "type var = nullptr". Here var will be known as nulled variable.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/collections.cpp | 11 | ||||
-rw-r--r-- | src/analysis/collections.h | 3 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 2 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index d8d9510..b7acf6d 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -187,6 +187,17 @@ void addUnknownVar(WalkItem &wi, wi.removeNullVarsAll.erase(var); } +void addNullVar(WalkItem &wi, + const std::string &var) +{ + wi.knownVars.insert(var); + wi.knownNullVars.insert(var); + wi.knownNonNullVars.erase(var); + wi.addNullVars.insert(var); + wi.removeNullVars.erase(var); + wi.removeNullVarsAll.erase(var); +} + void addNonNullVar(WalkItem &wi, const std::string &var) { diff --git a/src/analysis/collections.h b/src/analysis/collections.h index 1e36bf0..feb0eca 100644 --- a/src/analysis/collections.h +++ b/src/analysis/collections.h @@ -42,6 +42,9 @@ namespace Analysis void addNonNullVar(WalkItem &wi, const std::string &var); + void addNullVar(WalkItem &wi, + const std::string &var); + void addLinkedVar(WalkItem &wi, std::string parent, const std::string &var); diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index ddbffb1..70b1666 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -806,6 +806,8 @@ void handleSetVar(Node *node1, node2 = skipNop(node2); if (node2 == CALL_EXPR && isPointerArg(node1)) handleSetVarToFunction(var1, node2, wo); + else if (node2 == INTEGER_CST && node2->label == "0") + addNullVar(wo, var1); return; } else |