diff options
author | Jordy Rose <jediknil@belkadan.com> | 2011-06-15 05:14:03 +0000 |
---|---|---|
committer | Jordy Rose <jediknil@belkadan.com> | 2011-06-15 05:14:03 +0000 |
commit | 0e9fb28e9555c57478cffc3efdfc4fab6a651c1b (patch) | |
tree | ff64117fce5de7e7ae15e2b961715f3af08a4d20 /clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | |
parent | 5ee87726dd2548a91f24b94a9fbdd41c8c508bf6 (diff) | |
download | bcm5719-llvm-0e9fb28e9555c57478cffc3efdfc4fab6a651c1b.tar.gz bcm5719-llvm-0e9fb28e9555c57478cffc3efdfc4fab6a651c1b.zip |
[analyzer] If a C string length is UnknownVal, clear any existing length binding. No tests yet because the only thing that sets string length is strcpy(), and that needs some work anyway.
llvm-svn: 133044
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index fc9620f6337..ebf509cda90 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -458,8 +458,6 @@ const GRState *CStringChecker::setCStringLength(const GRState *state, const MemRegion *MR, SVal strLength) { assert(!strLength.isUndef() && "Attempt to set an undefined string length"); - if (strLength.isUnknown()) - return state; MR = MR->StripCasts(); @@ -474,7 +472,8 @@ const GRState *CStringChecker::setCStringLength(const GRState *state, case MemRegion::VarRegionKind: case MemRegion::FieldRegionKind: case MemRegion::ObjCIvarRegionKind: - return state->set<CStringLength>(MR, strLength); + // These are the types we can currently track string lengths for. + break; case MemRegion::ElementRegionKind: // FIXME: Handle element regions by upper-bounding the parent region's @@ -488,6 +487,11 @@ const GRState *CStringChecker::setCStringLength(const GRState *state, // warning for things like strcpy((char[]){'a', 0}, "b"); return state; } + + if (strLength.isUnknown()) + return state->remove<CStringLength>(MR); + + return state->set<CStringLength>(MR, strLength); } SVal CStringChecker::getCStringLengthForRegion(CheckerContext &C, |