[clang] [clang][analyzer] Introduce MutexModeling checker (PR #111381)
DonĂ¡t Nagy via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 8 06:44:37 PDT 2024
================
@@ -0,0 +1,126 @@
+//===--- MutexModelingDomain.h - Common vocabulary for modeling mutexes ---===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Defines common types and related functions used in the mutex modeling domain.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MUTEXMODELINGDOMAIN_H
+#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MUTEXMODELINGDOMAIN_H
+
+#include "MutexRegionExtractor.h"
+
+// Forward declarations.
+namespace clang {
+class Expr;
+class IdentifierInfo;
+namespace ento {
+class MemRegion;
+} // namespace ento
+} // namespace clang
+
+namespace clang::ento::mutex_modeling {
+
+// Represents different kinds of mutex-related events
+enum class EventKind { Init, Acquire, TryAcquire, Release, Destroy };
+
+// TODO: Ideally the modeling should not know about which checkers consume the
+// modeling information. This enum is here to make a correspondence between the
+// checked mutex event the library that event came from. In order to keep the
+// external API of multiple distinct checkers (PthreadLockChecker,
+// FuchsiaLockChecker and C11LockChecker), this mapping is done here, but if
+// more consumers of this modeling arise, adding all of them here may not be
+// feasible and we may need to make this modeling more flexible.
+enum class LibraryKind { NotApplicable = 0, Pthread, Fuchsia, C11 };
+
+// Represents different mutex operation semantics
+enum class SemanticsKind { NotApplicable = 0, PthreadSemantics, XNUSemantics };
+
+// Represents different states a mutex can be in, including error states
+enum class LockStateKind {
+ Unlocked,
+ Locked,
+ Destroyed,
+ UntouchedAndPossiblyDestroyed,
+ UnlockedAndPossiblyDestroyed,
+ Error_DoubleInit, // Mutex initialized twice
+ Error_DoubleInitWhileLocked, // Mutex initialized while already locked
+ Error_DoubleLock, // Mutex locked twice without unlocking
+ Error_LockDestroyed, // Attempt to lock a destroyed mutex
+ Error_DoubleUnlock, // Mutex unlocked twice without locking
+ Error_UnlockDestroyed, // Attempt to unlock a destroyed mutex
+ Error_LockReversal, // Locks acquired in incorrect order
+ Error_DestroyLocked, // Attempt to destroy a locked mutex
+ Error_DoubleDestroy // Mutex destroyed twice
+};
+
+/// This class is intended for describing the list of events to detect.
+/// This list of events is the configuration of the MutexModeling checker.
+struct EventDescriptor {
+ MutexRegionExtractor Trigger;
+ EventKind Kind{};
+ LibraryKind Library{};
+ SemanticsKind Semantics{};
+
+ // TODO: Modernize to spaceship when C++20 is available.
+ [[nodiscard]] bool operator!=(const EventDescriptor &Other) const noexcept {
+ return !(Trigger == Other.Trigger) || Library != Other.Library ||
----------------
NagyDonat wrote:
I think you can simply use `Trigger != Other.Trigger` because `std::variant` has a suitable `operator!=` in C++17 or later.
https://github.com/llvm/llvm-project/pull/111381
More information about the cfe-commits
mailing list