[clang] bee4813 - [clang][Checkers] Fix PthreadLockChecker state cleanup at dead symbol.

Balázs Kéri via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 6 02:04:51 PDT 2021


Author: Balázs Kéri
Date: 2021-04-06T11:15:29+02:00
New Revision: bee4813789a378584d43c65497a5efd2353a6606

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

LOG: [clang][Checkers] Fix PthreadLockChecker state cleanup at dead symbol.

It is possible that an entry in 'DestroyRetVal' lives longer
than an entry in 'LockMap' if not removed at checkDeadSymbols.
The added test case demonstrates this.

Reviewed By: NoQ

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

Added: 
    

Modified: 
    clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
    clang/test/Analysis/pthreadlock.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
index eb10a42b7d3d..ee71b55a39e6 100644
--- a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
@@ -647,8 +647,10 @@ void PthreadLockChecker::checkDeadSymbols(SymbolReaper &SymReaper,
 
   for (auto I : State->get<LockMap>()) {
     // Stop tracking dead mutex regions as well.
-    if (!SymReaper.isLiveRegion(I.first))
+    if (!SymReaper.isLiveRegion(I.first)) {
       State = State->remove<LockMap>(I.first);
+      State = State->remove<DestroyRetVal>(I.first);
+    }
   }
 
   // TODO: We probably need to clean up the lock stack as well.

diff  --git a/clang/test/Analysis/pthreadlock.c b/clang/test/Analysis/pthreadlock.c
index 6eb45ce4ae5b..85b34cbed918 100644
--- a/clang/test/Analysis/pthreadlock.c
+++ b/clang/test/Analysis/pthreadlock.c
@@ -513,3 +513,9 @@ void bad33(void) {
   fake_system_function();
   pthread_mutex_lock(pmtx); // expected-warning{{This lock has already been acquired}}
 }
+
+void nocrash1(pthread_mutex_t *mutex) {
+  int ret = pthread_mutex_destroy(mutex);
+  if (ret == 0) // no crash
+    ;
+}


        


More information about the cfe-commits mailing list