diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 0ae784c000f60..c15464e9a713f 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -2418,15 +2418,12 @@ void CStringChecker::evalStrcmpCommon(CheckerContext &C, const CallEvent &Call, // If the two arguments might be the same buffer, we know the result is 0, // and we only need to check one size. - if (StSameBuf) { + if (StSameBuf && !StNotSameBuf) { StSameBuf = StSameBuf->BindExpr(Call.getOriginExpr(), LCtx, svalBuilder.makeZeroVal(Call.getResultType())); C.addTransition(StSameBuf); - - // If the two arguments are GUARANTEED to be the same, we're done! - if (!StNotSameBuf) - return; + return; } assert(StNotSameBuf); diff --git a/clang/test/Analysis/string.c b/clang/test/Analysis/string.c index cdd36275568e3..45b81297a026e 100644 --- a/clang/test/Analysis/string.c +++ b/clang/test/Analysis/string.c @@ -955,6 +955,14 @@ void strcmp_fn_l(char *x) { strcmp((char*)&strcmp_null_argument, x); // expected-warning{{Argument to string comparison function is the address of the function 'strcmp_null_argument', which is not a null-terminated string}} } +void strcmp_assumptions(char *a, char *b) { + if (strcmp(a, b) == 0) { + // ... + } + + clang_analyzer_eval(a == b); // expected-warning{{FALSE}} +} + //===----------------------------------------------------------------------=== // strncmp() //===----------------------------------------------------------------------=== @@ -1070,6 +1078,14 @@ int strncmp_null_argument(char *a, size_t n) { return strncmp(a, b, n); // expected-warning{{Null pointer passed as 2nd argument to string comparison function}} } +void strncmp_assumptions(char *a, char *b, size_t n) { + if (strncmp(a, b, n) == 0) { + // ... + } + + clang_analyzer_eval(a == b); // expected-warning{{FALSE}} +} + //===----------------------------------------------------------------------=== // strcasecmp() //===----------------------------------------------------------------------===