From: Douglas Gregor Date: Mon, 1 Nov 2010 23:16:05 +0000 (+0000) Subject: Teach the CStringChecker and PthreadLockChecker about non-identifier X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=90d26a4afdbf6d917a5241ef3b316e1c8337c9b8;p=clang Teach the CStringChecker and PthreadLockChecker about non-identifier declaration names, from Jim Goodnow II! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117970 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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; +}