diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-12-13 17:59:36 -0800 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-12-13 18:00:24 -0800 |
commit | f450dd63a14d6cb16418f6a6f4de26916502c13f (patch) | |
tree | 243f908b0230014c4882410185e396b5c43d57e3 /clang/lib | |
parent | 93faa237da8ddeb9e2ad91980387bd4d633369a9 (diff) | |
download | bcm5719-llvm-f450dd63a14d6cb16418f6a6f4de26916502c13f.tar.gz bcm5719-llvm-f450dd63a14d6cb16418f6a6f4de26916502c13f.zip |
[analyzer] CStringChecker: Fix a crash on unknown value passed to strlcat.
Checkers should always account for unknown values.
Also use a slightly more high-level API that naturally avoids the problem.
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 4203f790e21..0cf7056a078 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -1706,13 +1706,12 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE, } else { if (appendK == ConcatFnKind::none) { // strlcpy returns strlen(src) - StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, *strLengthNL); - } else if (dstStrLengthNL) { + StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, strLength); + } else { // strlcat returns strlen(src) + strlen(dst) - SVal retSize = svalBuilder.evalBinOpNN( - state, BO_Add, *strLengthNL, *dstStrLengthNL, sizeTy); - StateZeroSize = - StateZeroSize->BindExpr(CE, LCtx, *(retSize.getAs<NonLoc>())); + SVal retSize = svalBuilder.evalBinOp( + state, BO_Add, strLength, dstStrLength, sizeTy); + StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, retSize); } } C.addTransition(StateZeroSize); |