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.yukhyme...@gmail.com> Date: Mon, 16 Jun 2025 08:55:06 +0100 Subject: [PATCH 1/4] 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.yukhyme...@gmail.com> Date: Mon, 16 Jun 2025 09:08:23 +0100 Subject: [PATCH 2/4] 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.yukhyme...@gmail.com> Date: Mon, 16 Jun 2025 09:13:36 +0100 Subject: [PATCH 3/4] 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.yukhyme...@gmail.com> Date: Mon, 1 Sep 2025 00:56:04 +0100 Subject: [PATCH 4/4] 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 ^^^^^^^^^^^^^^ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits