[clang] e4f4a6c - [analyzer] Prevent an assertion failure in PThreadLockChecker

Gabor Horvath via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 5 15:57:11 PST 2020


Author: Gabor Horvath
Date: 2020-02-05T15:56:56-08:00
New Revision: e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404

URL: https://github.com/llvm/llvm-project/commit/e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404
DIFF: https://github.com/llvm/llvm-project/commit/e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404.diff

LOG: [analyzer] Prevent an assertion failure in PThreadLockChecker

When the implementations of the locking functions are available.

Differential Revision: https://reviews.llvm.org/D74003

Added: 
    clang/test/Analysis/fuchsia_lock_impl.c

Modified: 
    clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
index d3470dad0a43..0bfe3b890e94 100644
--- a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
@@ -256,7 +256,9 @@ void PthreadLockChecker::checkPostCall(const CallEvent &Call,
   // are global C functions.
   // TODO: Maybe make this the default behavior of CallDescription
   // with exactly one identifier?
-  if (!Call.isGlobalCFunction())
+  // FIXME: Try to handle cases when the implementation was inlined rather
+  // than just giving up.
+  if (!Call.isGlobalCFunction() || C.wasInlined)
     return;
 
   if (const FnCheck *Callback = PThreadCallbacks.lookup(Call))

diff  --git a/clang/test/Analysis/fuchsia_lock_impl.c b/clang/test/Analysis/fuchsia_lock_impl.c
new file mode 100644
index 000000000000..e4c5ea501c3a
--- /dev/null
+++ b/clang/test/Analysis/fuchsia_lock_impl.c
@@ -0,0 +1,18 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=fuchsia.Lock -verify %s
+// expected-no-diagnostics
+typedef int spin_lock_t;
+
+void spin_lock(spin_lock_t *lock);
+int getCond();
+int spin_trylock(spin_lock_t *lock) {
+    if (getCond())
+        return 0;
+    return -1;
+}
+void spin_unlock(spin_lock_t *lock);
+
+spin_lock_t mtx;
+void no_crash() {
+  if (spin_trylock(&mtx) == 0)
+    spin_unlock(&mtx);
+}


        


More information about the cfe-commits mailing list