[clang-tools-extra] [clang][dataflow]Use cast_or_null instead cast to prevent crash (PR #68510)

2023-10-10 Thread Yitzhak Mandelbaum via cfe-commits


@@ -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)

2023-10-10 Thread Yitzhak Mandelbaum via cfe-commits

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)

2023-10-10 Thread Yitzhak Mandelbaum via cfe-commits


@@ -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)

2023-10-10 Thread Yitzhak Mandelbaum via cfe-commits

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)

2023-10-10 Thread Qizhi Hu via cfe-commits

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)

2023-10-10 Thread Qizhi Hu via cfe-commits

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)

2023-10-10 Thread Piotr Zegar via cfe-commits


@@ -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)

2023-10-09 Thread Qizhi Hu via cfe-commits

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)

2023-10-09 Thread Qizhi Hu via cfe-commits

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)

2023-10-09 Thread Piotr Zegar via cfe-commits

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