This revision was automatically updated to reflect the committed changes. Closed by commit rGe4f4a6c0f5bb: [analyzer] Prevent an assertion failure in PThreadLockChecker (authored by xazax.hun).
Changed prior to commit: https://reviews.llvm.org/D74003?vs=242447&id=242778#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D74003/new/ 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,9 @@ // 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))
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,9 @@ // 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))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits