Author: Gabor Horvath Date: 2020-02-05T15:56:56-08:00 New Revision: e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404
URL: https://github.com/llvm/llvm-project/commit/e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404 DIFF: https://github.com/llvm/llvm-project/commit/e4f4a6c0f5bbda5dc0b922816b3fdfce4b75f404.diff LOG: [analyzer] Prevent an assertion failure in PThreadLockChecker When the implementations of the locking functions are available. Differential Revision: https://reviews.llvm.org/D74003 Added: clang/test/Analysis/fuchsia_lock_impl.c Modified: clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp index d3470dad0a43..0bfe3b890e94 100644 --- a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp @@ -256,7 +256,9 @@ void PthreadLockChecker::checkPostCall(const CallEvent &Call, // are global C functions. // TODO: Maybe make this the default behavior of CallDescription // with exactly one identifier? - if (!Call.isGlobalCFunction()) + // FIXME: Try to handle cases when the implementation was inlined rather + // than just giving up. + if (!Call.isGlobalCFunction() || C.wasInlined) return; if (const FnCheck *Callback = PThreadCallbacks.lookup(Call)) diff --git a/clang/test/Analysis/fuchsia_lock_impl.c b/clang/test/Analysis/fuchsia_lock_impl.c new file mode 100644 index 000000000000..e4c5ea501c3a --- /dev/null +++ b/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); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits