================
@@ -373,15 +377,33 @@ void BlockInCriticalSectionChecker::checkPostCall(const
CallEvent &Call,
CheckerContext &C) const {
if (isBlockingInCritSection(Call, C)) {
reportBlockInCritSection(Call, C);
- } else if (std::optional<MutexDescriptor> LockDesc =
- checkDescriptorMatch(Call, C, /*IsLock=*/true)) {
- handleLock(*LockDesc, Call, C);
- } else if (std::optional<MutexDescriptor> UnlockDesc =
- checkDescriptorMatch(Call, C, /*IsLock=*/false)) {
+ return;
+ }
+
+ if (std::optional<MutexDescriptor> LockDesc =
+ checkDescriptorMatch(Call, C, /*IsLock=*/true)) {
+ if (!std::holds_alternative<RAIIMutexDescriptor>(*LockDesc))
+ handleLock(*LockDesc, Call, C);
+ return;
+ }
+ if (std::optional<MutexDescriptor> UnlockDesc =
+ checkDescriptorMatch(Call, C, /*IsLock=*/false)) {
handleUnlock(*UnlockDesc, Call, C);
}
}
+bool BlockInCriticalSectionChecker::evalCall(const CallEvent &Call,
+ CheckerContext &C) const {
+ if (std::optional<MutexDescriptor> LockDesc =
+ checkDescriptorMatch(Call, C, /*IsLock=*/true)) {
+ if (std::holds_alternative<RAIIMutexDescriptor>(*LockDesc)) {
----------------
Xazax-hun wrote:
One question though: shouldn't we do any additional binding of memory regions
here? Couldn't we get spurious uninitialized/unknown value warnings if we e.g.,
tried to load from a field of this type? Very unlikely scenario but who knows
what is out there.
https://github.com/llvm/llvm-project/pull/208729
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits