summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-12-13 17:59:36 -0800
committerArtem Dergachev <artem.dergachev@gmail.com>2019-12-13 18:00:24 -0800
commitf450dd63a14d6cb16418f6a6f4de26916502c13f (patch)
tree243f908b0230014c4882410185e396b5c43d57e3 /clang/lib
parent93faa237da8ddeb9e2ad91980387bd4d633369a9 (diff)
downloadbcm5719-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.cpp11
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);
OpenPOWER on IntegriCloud