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 + ; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits