diff options
-rw-r--r-- | lib/Checker/CStringChecker.cpp | 5 | ||||
-rw-r--r-- | lib/Checker/PthreadLockChecker.cpp | 5 | ||||
-rw-r--r-- | test/Analysis/operator-calls.cpp | 16 |
3 files changed, 24 insertions, 2 deletions
diff --git a/lib/Checker/CStringChecker.cpp b/lib/Checker/CStringChecker.cpp index d61fdd437d..966d04f6e1 100644 --- a/lib/Checker/CStringChecker.cpp +++ b/lib/Checker/CStringChecker.cpp @@ -905,7 +905,10 @@ bool CStringChecker::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { return false; // Get the name of the callee. If it's a builtin, strip off the prefix. - llvm::StringRef Name = FD->getName(); + IdentifierInfo *II = FD->getIdentifier(); + if (!II) // if no identifier, not a simple C function + return false; + llvm::StringRef Name = II->getName(); if (Name.startswith("__builtin_")) Name = Name.substr(10); diff --git a/lib/Checker/PthreadLockChecker.cpp b/lib/Checker/PthreadLockChecker.cpp index 74e266c3ed..c4bd364138 100644 --- a/lib/Checker/PthreadLockChecker.cpp +++ b/lib/Checker/PthreadLockChecker.cpp @@ -65,7 +65,10 @@ void PthreadLockChecker::PostVisitCallExpr(CheckerContext &C, if (!R) return; - llvm::StringRef FName = R->getDecl()->getName(); + IdentifierInfo *II = R->getDecl()->getIdentifier(); + if (!II) // if no identifier, not a simple C function + return; + llvm::StringRef FName = II->getName(); if (FName == "pthread_mutex_lock") { if (CE->getNumArgs() != 1) diff --git a/test/Analysis/operator-calls.cpp b/test/Analysis/operator-calls.cpp new file mode 100644 index 0000000000..1b8b629f35 --- /dev/null +++ b/test/Analysis/operator-calls.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-experimental-checks -verify %s +struct X0 { }; +bool operator==(const X0&, const X0&); + +// PR7287 +struct test { int a[2]; }; + +void t2() { + test p = {{1,2}}; + test q; + q = p; +} + +bool PR7287(X0 a, X0 b) { + return a == b; +} |