diff --git a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp @@ -647,8 +647,10 @@ for (auto I : State->get()) { // Stop tracking dead mutex regions as well. - if (!SymReaper.isLiveRegion(I.first)) + if (!SymReaper.isLiveRegion(I.first)) { State = State->remove(I.first); + State = State->remove(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 --- a/clang/test/Analysis/pthreadlock.c +++ b/clang/test/Analysis/pthreadlock.c @@ -513,3 +513,9 @@ 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 + ; +}