diff options
author | David Carlier <devnexen@gmail.com> | 2018-05-23 04:38:25 +0000 |
---|---|---|
committer | David Carlier <devnexen@gmail.com> | 2018-05-23 04:38:25 +0000 |
commit | 3c90fcebd4adebe2bb5d4fd91379348510951ec9 (patch) | |
tree | 853002527c04f708b5a5376b4f7cfffcbf59d90a | |
parent | 5764db4e57e217b2ecaa6c9800ec98edc2a5e7c2 (diff) | |
download | bcm5719-llvm-3c90fcebd4adebe2bb5d4fd91379348510951ec9.tar.gz bcm5719-llvm-3c90fcebd4adebe2bb5d4fd91379348510951ec9.zip |
[analyzer] CStringChecker fix for strlcpy when no bytes are copied to the dest buffer
Again, strlc* does not return a pointer so the zero size case doest not fit.
Reviewers: NoQ, george.karpenkov
Reviewed by: NoQ
Differential Revision: https://reviews.llvm.org/D47007
llvm-svn: 333060
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 6 | ||||
-rw-r--r-- | clang/test/Analysis/bsd-string.c | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 39db5861890..a51bc062e19 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -1652,7 +1652,11 @@ void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE, // If the size is known to be zero, we're done. if (StateZeroSize && !StateNonZeroSize) { - StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, DstVal); + if (returnPtr) { + StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, DstVal); + } else { + StateZeroSize = StateZeroSize->BindExpr(CE, LCtx, *lenValNL); + } C.addTransition(StateZeroSize); return; } diff --git a/clang/test/Analysis/bsd-string.c b/clang/test/Analysis/bsd-string.c index 4c57c86f174..14e1b00fc00 100644 --- a/clang/test/Analysis/bsd-string.c +++ b/clang/test/Analysis/bsd-string.c @@ -38,3 +38,8 @@ void f6() { size_t len = strlcat(buf, "defg", 4); clang_analyzer_eval(len == 7); // expected-warning{{TRUE}} } + +int f7() { + char buf[8]; + return strlcpy(buf, "1234567", 0); // no-crash +} |