[clang] [clang-tools-extra] [clang-tidy] `bugprone-unchecked-optional-access`: handle `BloombergLP::bdlb:NullableValue::makeValue` to prevent false-positives (PR #144313)
Valentyn Yukhymenko via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 8 00:56:40 PDT 2025
https://github.com/BaLiKfromUA updated https://github.com/llvm/llvm-project/pull/144313
>From b2e5ee18bf7f03bbf5f99ef124ef707dc3116886 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhymenko at gmail.com>
Date: Mon, 16 Jun 2025 08:55:06 +0100
Subject: [PATCH 1/5] first iteration of fix
---
.../bde/types/bdlb_nullablevalue.h | 8 ++++++++
.../bugprone/unchecked-optional-access.cpp | 14 ++++++++++++++
.../Models/UncheckedOptionalAccessModel.cpp | 13 +++++++++++++
3 files changed, 35 insertions(+)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/Inputs/unchecked-optional-access/bde/types/bdlb_nullablevalue.h b/clang-tools-extra/test/clang-tidy/checkers/bugprone/Inputs/unchecked-optional-access/bde/types/bdlb_nullablevalue.h
index 4411bcfd60a74..0812677111995 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/Inputs/unchecked-optional-access/bde/types/bdlb_nullablevalue.h
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/Inputs/unchecked-optional-access/bde/types/bdlb_nullablevalue.h
@@ -20,6 +20,14 @@ class NullableValue : public bsl::optional<T> {
const T &value() const &;
T &value() &;
+ constexpr T &makeValue();
+
+ template <typename U>
+ constexpr T &makeValue(U&& v);
+
+ template <typename... ARGS>
+ constexpr T &makeValueInplace(ARGS &&... args);
+
// 'operator bool' is inherited from bsl::optional
constexpr bool isNull() const noexcept;
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unchecked-optional-access.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unchecked-optional-access.cpp
index 3167b85f0e024..b910db20b3c2e 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unchecked-optional-access.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unchecked-optional-access.cpp
@@ -141,6 +141,20 @@ void nullable_value_after_swap(BloombergLP::bdlb::NullableValue<int> &opt1, Bloo
}
}
+void nullable_value_make_value(BloombergLP::bdlb::NullableValue<int> &opt1, BloombergLP::bdlb::NullableValue<int> &opt2) {
+ if (opt1.isNull()) {
+ opt1.makeValue(42);
+ }
+
+ opt1.value();
+
+ if (opt2.isNull()) {
+ opt2.makeValueInplace(42);
+ }
+
+ opt2.value();
+}
+
template <typename T>
void function_template_without_user(const absl::optional<T> &opt) {
opt.value(); // no-warning
diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
index 164d2574132dd..decb32daa9410 100644
--- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
@@ -985,6 +985,19 @@ auto buildTransferMatchSwitch() {
isOptionalMemberCallWithNameMatcher(hasName("isNull")),
transferOptionalIsNullCall)
+ // NullableValue::makeValue, NullableValue::makeValueInplace
+ // Only NullableValue has these methods, but this
+ // will also pass for other types
+ .CaseOfCFGStmt<CXXMemberCallExpr>(
+ isOptionalMemberCallWithNameMatcher(hasAnyName("makeValue", "makeValueInplace")),
+ [](const CXXMemberCallExpr *E, const MatchFinder::MatchResult &,
+ LatticeTransferState &State) {
+ if (RecordStorageLocation *Loc =
+ getImplicitObjectLocation(*E, State.Env)) {
+ setHasValue(*Loc, State.Env.getBoolLiteralValue(true), State.Env);
+ }
+ })
+
// optional::emplace
.CaseOfCFGStmt<CXXMemberCallExpr>(
isOptionalMemberCallWithNameMatcher(hasName("emplace")),
>From cacdf75791044720c51357cc977ed5dac6489a06 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhymenko at gmail.com>
Date: Mon, 16 Jun 2025 09:08:23 +0100
Subject: [PATCH 2/5] format
---
.../FlowSensitive/Models/UncheckedOptionalAccessModel.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
index decb32daa9410..75f193c973784 100644
--- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
@@ -989,7 +989,8 @@ auto buildTransferMatchSwitch() {
// Only NullableValue has these methods, but this
// will also pass for other types
.CaseOfCFGStmt<CXXMemberCallExpr>(
- isOptionalMemberCallWithNameMatcher(hasAnyName("makeValue", "makeValueInplace")),
+ isOptionalMemberCallWithNameMatcher(
+ hasAnyName("makeValue", "makeValueInplace")),
[](const CXXMemberCallExpr *E, const MatchFinder::MatchResult &,
LatticeTransferState &State) {
if (RecordStorageLocation *Loc =
>From fc0262b596b6cc1e11760b7b105514cda23d7694 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhymenko at gmail.com>
Date: Mon, 16 Jun 2025 09:13:36 +0100
Subject: [PATCH 3/5] format
---
.../FlowSensitive/Models/UncheckedOptionalAccessModel.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
index 75f193c973784..d45fb57b70f37 100644
--- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
@@ -987,10 +987,10 @@ auto buildTransferMatchSwitch() {
// NullableValue::makeValue, NullableValue::makeValueInplace
// Only NullableValue has these methods, but this
- // will also pass for other types
+ // will also pass for other types
.CaseOfCFGStmt<CXXMemberCallExpr>(
isOptionalMemberCallWithNameMatcher(
- hasAnyName("makeValue", "makeValueInplace")),
+ hasAnyName("makeValue", "makeValueInplace")),
[](const CXXMemberCallExpr *E, const MatchFinder::MatchResult &,
LatticeTransferState &State) {
if (RecordStorageLocation *Loc =
>From f8476aa1b4999baa0d4da55e8101369bb0bebdae Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhymenko at gmail.com>
Date: Mon, 1 Sep 2025 00:56:04 +0100
Subject: [PATCH 4/5] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index d83fb8b10ddba..d14f1576f5a4c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -245,6 +245,9 @@ Changes in existing checks
<clang-tidy/checks/readability/qualified-auto>` check by adding the option
`IgnoreAliasing`, that allows not looking at underlying types of type aliases.
+- Improved :doc:`bugprone-unchecked-optional-access
+ <clang-tidy/checks/bugprone/unchecked-optional-access>` check by supporting `NullableValue::makeValue` and `NullableValue::makeValueInplace` to prevent false-positives for `BloombergLP::bdlb::NullableValue` type.
+
Removed checks
^^^^^^^^^^^^^^
>From 4799dd745d2866c21a119682c27355c632de0959 Mon Sep 17 00:00:00 2001
From: Valentyn Yukhymenko <valentin.yukhymenko at gmail.com>
Date: Mon, 8 Sep 2025 08:56:08 +0100
Subject: [PATCH 5/5] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index ed373badf9a38..18f63b7734346 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -182,6 +182,11 @@ Changes in existing checks
namespace are treated as the tag or the data part of a user-defined
tagged union respectively.
+- Improved :doc:`bugprone-unchecked-optional-access
+ <clang-tidy/checks/bugprone/unchecked-optional-access>` check by supporting
+ `NullableValue::makeValue` and `NullableValue::makeValueInplace` to prevent
+ false-positives for `BloombergLP::bdlb::NullableValue` type.
+
- Improved :doc:`bugprone-unhandled-self-assignment
<clang-tidy/checks/bugprone/unhandled-self-assignment>` check by adding
an additional matcher that generalizes the copy-and-swap idiom pattern
@@ -245,9 +250,6 @@ Changes in existing checks
<clang-tidy/checks/readability/qualified-auto>` check by adding the option
`IgnoreAliasing`, that allows not looking at underlying types of type aliases.
-- Improved :doc:`bugprone-unchecked-optional-access
- <clang-tidy/checks/bugprone/unchecked-optional-access>` check by supporting `NullableValue::makeValue` and `NullableValue::makeValueInplace` to prevent false-positives for `BloombergLP::bdlb::NullableValue` type.
-
- Improved :doc:`readability-uppercase-literal-suffix
<clang-tidy/checks/readability/uppercase-literal-suffix>` check to recognize
literal suffixes added in C++23 and C23.
More information about the cfe-commits
mailing list