diff --git a/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp index d3470dad0a430..0bfe3b890e944 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 0000000000000..e4c5ea501c3a8 --- /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); +}