[PATCH] D98502: [clang][Checkers] Extend PthreadLockChecker state dump (NFC).
Balázs Kéri via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 22 08:16:14 PDT 2021
balazske updated this revision to Diff 332293.
balazske added a comment.
Simplified the test somewhat.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98502/new/
https://reviews.llvm.org/D98502
Files:
clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
clang/test/Analysis/pthreadlock_state.c
Index: clang/test/Analysis/pthreadlock_state.c
===================================================================
--- /dev/null
+++ clang/test/Analysis/pthreadlock_state.c
@@ -0,0 +1,67 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.unix.PthreadLock,debug.ExprInspection 2>&1 %s | FileCheck %s
+
+#include "Inputs/system-header-simulator-for-pthread-lock.h"
+
+#define NULL 0
+
+void clang_analyzer_printState();
+
+pthread_mutex_t mtx;
+
+void test(pthread_mutex_t *mtx1) {
+ clang_analyzer_printState();
+ // CHECK: "checker_messages": null
+
+ pthread_mutex_init(&mtx, NULL);
+ clang_analyzer_printState();
+ // CHECK: { "checker": "alpha.core.PthreadLockBase", "messages": [
+ // CHECK-NEXT: "Mutex states:",
+ // CHECK-NEXT: "mtx: unlocked",
+ // CHECK-NEXT: ""
+ // CHECK-NEXT: ]}
+
+ pthread_mutex_lock(&mtx);
+ clang_analyzer_printState();
+ // CHECK: { "checker": "alpha.core.PthreadLockBase", "messages": [
+ // CHECK-NEXT: "Mutex states:",
+ // CHECK-NEXT: "mtx: locked",
+ // CHECK-NEXT: "Mutex lock order:",
+ // CHECK-NEXT: "mtx",
+ // CHECK-NEXT: ""
+ // CHECK-NEXT: ]}
+
+ pthread_mutex_unlock(&mtx);
+ clang_analyzer_printState();
+ // CHECK: { "checker": "alpha.core.PthreadLockBase", "messages": [
+ // CHECK-NEXT: "Mutex states:",
+ // CHECK-NEXT: "mtx: unlocked",
+ // CHECK-NEXT: ""
+ // CHECK-NEXT: ]}
+
+ int ret = pthread_mutex_destroy(&mtx);
+ clang_analyzer_printState();
+ // CHECK: { "checker": "alpha.core.PthreadLockBase", "messages": [
+ // CHECK-NEXT: "Mutex states:",
+ // CHECK-NEXT: "mtx: unlocked, possibly destroyed",
+ // CHECK-NEXT: "Mutexes in unresolved possibly destroyed state:",
+ // CHECK-NEXT: "mtx: conj_$
+ // CHECK-NEXT: ""
+ // CHECK-NEXT: ]}
+
+ if (ret)
+ return;
+
+ ret = pthread_mutex_destroy(mtx1);
+ clang_analyzer_printState();
+ // CHECK: { "checker": "alpha.core.PthreadLockBase", "messages": [
+ // CHECK-NEXT: "Mutex states:",
+ // CHECK-NEXT: "mtx: destroyed",
+ // CHECK-NEXT: "SymRegion{reg_$[[REG:[0-9]+]]<pthread_mutex_t * mtx1>}: not tracked, possibly destroyed",
+ // CHECK-NEXT: "Mutexes in unresolved possibly destroyed state:",
+ // CHECK-NEXT: "SymRegion{reg_$[[REG]]<pthread_mutex_t * mtx1>}: conj_$
+ // CHECK-NEXT: ""
+ // CHECK-NEXT: ]}
+ if (ret)
+ return;
+ pthread_mutex_init(mtx1, NULL);
+}
Index: clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
+++ clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
@@ -339,7 +339,16 @@
}
}
- // TODO: Dump destroyed mutex symbols?
+ DestroyRetValTy DRV = State->get<DestroyRetVal>();
+ if (!DRV.isEmpty()) {
+ Out << Sep << "Mutexes in unresolved possibly destroyed state:" << NL;
+ for (auto I : DRV) {
+ I.first->dumpToStream(Out);
+ Out << ": ";
+ I.second->dumpToStream(Out);
+ Out << NL;
+ }
+ }
}
void PthreadLockChecker::AcquirePthreadLock(const CallEvent &Call,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98502.332293.patch
Type: text/x-patch
Size: 3184 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210322/520526c1/attachment.bin>
More information about the cfe-commits
mailing list