[analyzer] Prevent an assertion failure in PThreadLockChecker

When the implementations of the locking functions are available.

Differential Revision: https://reviews.llvm.org/D74003
This commit is contained in:
Gabor Horvath 2020-02-04 15:44:57 -08:00
parent 98b273c893
commit e4f4a6c0f5
2 changed files with 21 additions and 1 deletions

View File

@ -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))

View File

@ -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);
}