]> granicus.if.org Git - clang/commitdiff
[analyzer] CStringChecker fix for strlcpy when no bytes are copied to the dest buffer
authorDavid Carlier <devnexen@gmail.com>
Wed, 23 May 2018 04:38:25 +0000 (04:38 +0000)
committerDavid Carlier <devnexen@gmail.com>
Wed, 23 May 2018 04:38:25 +0000 (04:38 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333060 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/CStringChecker.cpp
test/Analysis/bsd-string.c

index 39db5861890cf1f5e84ad1adf6563a8377737e51..a51bc062e19fef2b322f264361cef861b4d8e718 100644 (file)
@@ -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;
         }
index 4c57c86f174a040de891347f47539c2cb12f4ad1..14e1b00fc000fb703a7c9687aebe56164efa2732 100644 (file)
@@ -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
+}