xazax.hun created this revision. xazax.hun added reviewers: NoQ, haowei. xazax.hun added a project: clang. Herald added subscribers: Charusso, gamesh411, dkrupp, donat.nagy, Szelethus, jfb, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware.
This is very unlikely to happen for PThreads, but using the CSA on a libc or Fuchsia will trigger this assertion failure. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D74003 Files: clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp clang/test/Analysis/fuchsia_lock_impl.c Index: clang/test/Analysis/fuchsia_lock_impl.c =================================================================== --- /dev/null +++ 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); +} Index: clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp @@ -256,7 +256,7 @@ // are global C functions. // TODO: Maybe make this the default behavior of CallDescription // with exactly one identifier? - if (!Call.isGlobalCFunction()) + if (!Call.isGlobalCFunction() || C.wasInlined) return; if (const FnCheck *Callback = PThreadCallbacks.lookup(Call))
Index: clang/test/Analysis/fuchsia_lock_impl.c =================================================================== --- /dev/null +++ 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); +} Index: clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp @@ -256,7 +256,7 @@ // are global C functions. // TODO: Maybe make this the default behavior of CallDescription // with exactly one identifier? - if (!Call.isGlobalCFunction()) + if (!Call.isGlobalCFunction() || C.wasInlined) return; if (const FnCheck *Callback = PThreadCallbacks.lookup(Call))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits