[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
@@ -180,3 +180,44 @@ void std_forward_rvalue_ref_safe(absl::optional&& opt) { std::forward>(opt).value(); } + +namespace std { + +template +class optional { +public: + template + optional& operator=(const U ){ + data = u; + } +private: + T data; +}; + +template +class vector { +public: + vector() {} + T [](unsigned long index) { return data[index]; } + bool empty() { return size == 0UL; } + +private: + T *data; + unsigned long size; +}; + +} // namespace std + +struct LinearGradient { + struct Stop { +std::optional position; + }; + std::vector stops; +}; + + +void use_dyn_cast_or_null() { ymand wrote: Please identify the test case rather than the implementation fix. https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/ymand requested changes to this pull request. Thanks for this fix! Unfortunately, I wasn't able to repro the crash in godbolt: https://godbolt.org/z/s741z5djY. Can you double check that the check crashes on that example without your fix? https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
@@ -180,3 +180,44 @@ void std_forward_rvalue_ref_safe(absl::optional&& opt) { std::forward>(opt).value(); } + +namespace std { + +template +class optional { +public: + template + optional& operator=(const U ){ + data = u; + } +private: + T data; +}; + +template +class vector { +public: + vector() {} + T [](unsigned long index) { return data[index]; } + bool empty() { return size == 0UL; } + +private: + T *data; + unsigned long size; ymand wrote: I think simpler would be better here -- please leave out the definitions of the methods and the private data. https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/ymand edited https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/68510 >From eb9f8342821048edefaefd038bdd989853ac69a3 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 8 Oct 2023 16:00:29 +0800 Subject: [PATCH] [clang][analysis]Use dyn_cast_or_null instead cast to prevent crash --- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++ .../bugprone/unchecked-optional-access.cpp| 41 +++ .../Models/UncheckedOptionalAccessModel.cpp | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c1b926b296b055a..837fd6ca1b61173 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -202,6 +202,10 @@ Changes in existing checks ` check, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved :doc:`bugprone-unchecked-optional-access + ` check, so that it does + not crash during handling of optional values. + - Improved :doc:`bugprone-undefined-memory-manipulation ` check to support fixed-size arrays of non-trivial types. 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 1921291f2187d92..c797a263a3220b8 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 @@ -180,3 +180,44 @@ void std_forward_rvalue_ref_safe(absl::optional&& opt) { std::forward>(opt).value(); } + +namespace std { + +template +class optional { +public: + template + optional& operator=(const U ){ + data = u; + } +private: + T data; +}; + +template +class vector { +public: + vector() {} + T [](unsigned long index) { return data[index]; } + bool empty() { return size == 0UL; } + +private: + T *data; + unsigned long size; +}; + +} // namespace std + +struct LinearGradient { + struct Stop { +std::optional position; + }; + std::vector stops; +}; + + +void use_dyn_cast_or_null() { + LinearGradient gradient; + if (!gradient.stops.empty()) + gradient.stops[0].position = 0; +} diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp index f61f26ff27804ec..8bd9a030f50cda0 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -599,7 +599,7 @@ void transferAssignment(const CXXOperatorCallExpr *E, BoolValue , LatticeTransferState ) { assert(E->getNumArgs() > 0); - if (auto *Loc = cast( + if (auto *Loc = cast_or_null( State.Env.getStorageLocation(*E->getArg(0 { createOptionalValue(*Loc, HasValueVal, State.Env); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
jcsxky wrote: > LGTM, When release notes could be nice > (clang-tools-extra/doc/ReleaseNotest.rst) with something like: `Improved > bugprone-unchecked-optional-acces check to not crash during handling of > optional values` or `to not crash i certain situations` it may also not be so > necessary, as this is just very quick fix. Release notes have been updated according to your suggestion. Thank you for detail guidance! https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
@@ -202,6 +202,10 @@ Changes in existing checks ` check, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved :doc:`bugprone-unchecked-optional-access + ` check, use `cast_or_null` + instead `cast` so that it does not crash during handling of optional values. PiotrZSL wrote: information about cast or cast_or_null is not needed here, this is just info for users who had this check crashed, and decided to disable it, to consider re-enabling it or even testing it again on their projects. https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/68510 >From 466b612ff055ff7497c9473b38b90bc849370b21 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 8 Oct 2023 16:00:29 +0800 Subject: [PATCH] [clang][analysis]Use dyn_cast_or_null instead cast to prevent crash --- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++ .../bugprone/unchecked-optional-access.cpp| 41 +++ .../Models/UncheckedOptionalAccessModel.cpp | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c1b926b296b055a..d50c9ace57c0fce 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -202,6 +202,10 @@ Changes in existing checks ` check, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved :doc:`bugprone-unchecked-optional-access + ` check, use `cast_or_null` + instead `cast` so that it does not crash during handling of optional values. + - Improved :doc:`bugprone-undefined-memory-manipulation ` check to support fixed-size arrays of non-trivial types. 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 1921291f2187d92..c797a263a3220b8 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 @@ -180,3 +180,44 @@ void std_forward_rvalue_ref_safe(absl::optional&& opt) { std::forward>(opt).value(); } + +namespace std { + +template +class optional { +public: + template + optional& operator=(const U ){ + data = u; + } +private: + T data; +}; + +template +class vector { +public: + vector() {} + T [](unsigned long index) { return data[index]; } + bool empty() { return size == 0UL; } + +private: + T *data; + unsigned long size; +}; + +} // namespace std + +struct LinearGradient { + struct Stop { +std::optional position; + }; + std::vector stops; +}; + + +void use_dyn_cast_or_null() { + LinearGradient gradient; + if (!gradient.stops.empty()) + gradient.stops[0].position = 0; +} diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp index f61f26ff27804ec..8bd9a030f50cda0 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -599,7 +599,7 @@ void transferAssignment(const CXXOperatorCallExpr *E, BoolValue , LatticeTransferState ) { assert(E->getNumArgs() > 0); - if (auto *Loc = cast( + if (auto *Loc = cast_or_null( State.Env.getStorageLocation(*E->getArg(0 { createOptionalValue(*Loc, HasValueVal, State.Env); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/68510 >From 38cf358039d81fb3703885db082b64e11760c5fc Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 8 Oct 2023 16:00:29 +0800 Subject: [PATCH] [clang][analysis]Use dyn_cast_or_null instead cast to prevent crash --- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++ .../bugprone/unchecked-optional-access.cpp| 41 +++ .../Models/UncheckedOptionalAccessModel.cpp | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c1b926b296b055a..8b2ad4f09f1798d 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -202,6 +202,10 @@ Changes in existing checks ` check, so that it does not warn on macros starting with underscore and lowercase letter. +- Improved :doc:`bugprone-unchecked-optional-access + ` check, use cast_or_null + instead cast so that it does not crash during handling of optional values. + - Improved :doc:`bugprone-undefined-memory-manipulation ` check to support fixed-size arrays of non-trivial types. 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 1921291f2187d92..c797a263a3220b8 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 @@ -180,3 +180,44 @@ void std_forward_rvalue_ref_safe(absl::optional&& opt) { std::forward>(opt).value(); } + +namespace std { + +template +class optional { +public: + template + optional& operator=(const U ){ + data = u; + } +private: + T data; +}; + +template +class vector { +public: + vector() {} + T [](unsigned long index) { return data[index]; } + bool empty() { return size == 0UL; } + +private: + T *data; + unsigned long size; +}; + +} // namespace std + +struct LinearGradient { + struct Stop { +std::optional position; + }; + std::vector stops; +}; + + +void use_dyn_cast_or_null() { + LinearGradient gradient; + if (!gradient.stops.empty()) + gradient.stops[0].position = 0; +} diff --git a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp index f61f26ff27804ec..8bd9a030f50cda0 100644 --- a/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ b/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -599,7 +599,7 @@ void transferAssignment(const CXXOperatorCallExpr *E, BoolValue , LatticeTransferState ) { assert(E->getNumArgs() > 0); - if (auto *Loc = cast( + if (auto *Loc = cast_or_null( State.Env.getStorageLocation(*E->getArg(0 { createOptionalValue(*Loc, HasValueVal, State.Env); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)
https://github.com/PiotrZSL approved this pull request. LGTM, When release notes could be nice (clang-tools-extra/doc/ReleaseNotest.rst) with something like: `Improved bugprone-unchecked-optional-acces check to not crash during handling of optional values` or `to not crash i certain situations` it may also not be so necessary, as this is just very quick fix. https://github.com/llvm/llvm-project/pull/68510 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits