[clang] fix(95366): enhance cast operation safety with LValue validation (PR #95479)
Oleksandr T. via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 14 08:00:12 PDT 2024
https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/95479
>From d66fdcbe0a56e17dbd25e6d2ed5bdcce1970fdea Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Fri, 14 Jun 2024 01:26:34 +0300
Subject: [PATCH 1/4] fix(95366): enhance cast operation safety with LValue
validation
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/AST/ExprConstant.cpp | 3 +++
clang/test/Sema/integral-to-ptr.c | 3 +++
3 files changed, 7 insertions(+)
create mode 100644 clang/test/Sema/integral-to-ptr.c
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8c2f737836a9d..755557906360b 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -847,6 +847,7 @@ Bug Fixes to C++ Support
- Fixed several bugs in capturing variables within unevaluated contexts. (#GH63845), (#GH67260), (#GH69307),
(#GH88081), (#GH89496), (#GH90669) and (#GH91633).
- Fixed handling of brace ellison when building deduction guides. (#GH64625), (#GH83368).
+- Fix an assertion failure caused by non-lvalue usage in lvalue context. (GH95366).
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 7178f081d9cf3..08bee806f172f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9325,6 +9325,9 @@ bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
Result.IsNullPtr = false;
return true;
} else {
+ if (!Value.isLValue())
+ return false;
+
// Cast is of an lvalue, no need to change value.
Result.setFrom(Info.Ctx, Value);
return true;
diff --git a/clang/test/Sema/integral-to-ptr.c b/clang/test/Sema/integral-to-ptr.c
new file mode 100644
index 0000000000000..99f83c3e52057
--- /dev/null
+++ b/clang/test/Sema/integral-to-ptr.c
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 %s -verify -fsyntax-only -std=c11
+
+int x(void) { e: b: ; return &&e - &&b < x; } // expected-warning {{ordered comparison between pointer and integer ('long' and 'int (*)(void)')}}
>From 8ce09ce067b22346378d6f108e4fa1786bc460ef Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Fri, 14 Jun 2024 08:50:03 +0300
Subject: [PATCH 2/4] update test expectations
---
clang/test/Sema/integral-to-ptr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/Sema/integral-to-ptr.c b/clang/test/Sema/integral-to-ptr.c
index 99f83c3e52057..b8ab4cb79820d 100644
--- a/clang/test/Sema/integral-to-ptr.c
+++ b/clang/test/Sema/integral-to-ptr.c
@@ -1,3 +1,3 @@
// RUN: %clang_cc1 %s -verify -fsyntax-only -std=c11
-int x(void) { e: b: ; return &&e - &&b < x; } // expected-warning {{ordered comparison between pointer and integer ('long' and 'int (*)(void)')}}
+int x(void) { e: b: ; return &&e - &&b < x; } // expected-warning {{ordered comparison between pointer and integer}}
>From 319b315d57487811399c113e259c0083a50ea0a9 Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Fri, 14 Jun 2024 17:58:47 +0300
Subject: [PATCH 3/4] add detailed comment
---
clang/lib/AST/ExprConstant.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 08bee806f172f..2b7a05664114f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9325,6 +9325,9 @@ bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
Result.IsNullPtr = false;
return true;
} else {
+ // In rare instances, the value isn't an lvalue.
+ // For example, when the value is the difference between the addresses of two labels.
+ // We reject that as a constant expression because we can't compute a valid offset to convert into a pointer.
if (!Value.isLValue())
return false;
>From 6e5d004706826eb1c65a813d6ef9cc3de55b12ba Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Fri, 14 Jun 2024 17:59:28 +0300
Subject: [PATCH 4/4] update changelog message
---
clang/docs/ReleaseNotes.rst | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 755557906360b..efd17d8f9a089 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -847,7 +847,8 @@ Bug Fixes to C++ Support
- Fixed several bugs in capturing variables within unevaluated contexts. (#GH63845), (#GH67260), (#GH69307),
(#GH88081), (#GH89496), (#GH90669) and (#GH91633).
- Fixed handling of brace ellison when building deduction guides. (#GH64625), (#GH83368).
-- Fix an assertion failure caused by non-lvalue usage in lvalue context. (GH95366).
+- Fixed a failed assertion when attempting to convert an integer representing the difference
+ between the addresses of two labels (a GNU extension) to a pointer within a constant expression. (GH95366).
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
More information about the cfe-commits
mailing list