[clang] [llvm] [Clang] Protect ObjCMethodList assignment operator against self-assignment (PR #97933)

via cfe-commits cfe-commits at lists.llvm.org
Sun Aug 4 20:12:49 PDT 2024


https://github.com/smanna12 updated https://github.com/llvm/llvm-project/pull/97933

>From 2653b8a0ab3792a22570118ed3b90cb302879ab0 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Sat, 6 Jul 2024 19:22:01 -0700
Subject: [PATCH 1/3] [Clang] Protect ObjCMethodList assignment operator
 against self-assignment

This patch adds a self-assignment check to the ObjCMethodList assignment
operator to prevent issues when an object is assigned to itself.

The fix ensures the integrity of the object's data during such assignments.
---
 clang/include/clang/Sema/ObjCMethodList.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Sema/ObjCMethodList.h b/clang/include/clang/Sema/ObjCMethodList.h
index 9e65e0d8e00af..c4465f6ab59fd 100644
--- a/clang/include/clang/Sema/ObjCMethodList.h
+++ b/clang/include/clang/Sema/ObjCMethodList.h
@@ -37,8 +37,10 @@ struct ObjCMethodList {
         NextAndExtraBits(L.NextAndExtraBits) {}
 
   ObjCMethodList &operator=(const ObjCMethodList &L) {
-    MethodAndHasMoreThanOneDecl = L.MethodAndHasMoreThanOneDecl;
-    NextAndExtraBits = L.NextAndExtraBits;
+    if (this != &L) { // Check for self-assignment
+      MethodAndHasMoreThanOneDecl = L.MethodAndHasMoreThanOneDecl;
+      NextAndExtraBits = L.NextAndExtraBits;
+    }
     return *this;
   }
 

>From 7a9f2bb3d47f4b7cb16a3c533d66456011aceb0c Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Fri, 2 Aug 2024 14:45:27 -0700
Subject: [PATCH 2/3] Address review comments

---
 clang/include/clang/Sema/ObjCMethodList.h | 6 ++----
 llvm/include/llvm/ADT/PointerIntPair.h    | 4 +++-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/clang/include/clang/Sema/ObjCMethodList.h b/clang/include/clang/Sema/ObjCMethodList.h
index c4465f6ab59fd..9e65e0d8e00af 100644
--- a/clang/include/clang/Sema/ObjCMethodList.h
+++ b/clang/include/clang/Sema/ObjCMethodList.h
@@ -37,10 +37,8 @@ struct ObjCMethodList {
         NextAndExtraBits(L.NextAndExtraBits) {}
 
   ObjCMethodList &operator=(const ObjCMethodList &L) {
-    if (this != &L) { // Check for self-assignment
-      MethodAndHasMoreThanOneDecl = L.MethodAndHasMoreThanOneDecl;
-      NextAndExtraBits = L.NextAndExtraBits;
-    }
+    MethodAndHasMoreThanOneDecl = L.MethodAndHasMoreThanOneDecl;
+    NextAndExtraBits = L.NextAndExtraBits;
     return *this;
   }
 
diff --git a/llvm/include/llvm/ADT/PointerIntPair.h b/llvm/include/llvm/ADT/PointerIntPair.h
index f73f5bcd6ce0c..4ed711163b3ed 100644
--- a/llvm/include/llvm/ADT/PointerIntPair.h
+++ b/llvm/include/llvm/ADT/PointerIntPair.h
@@ -45,7 +45,9 @@ template <typename Ptr> struct PunnedPointer {
   constexpr operator intptr_t() const { return asInt(); }
 
   constexpr PunnedPointer &operator=(intptr_t V) {
-    std::memcpy(Data, &V, sizeof(Data));
+    if (reinterpret_cast<intptr_t>(Data) != V) {
+      std::memcpy(Data, &V, sizeof(Data));
+    }
     return *this;
   }
 

>From 2916dc8bbc466996e014dfc1fbd760feae21ee30 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Sun, 4 Aug 2024 20:12:09 -0700
Subject: [PATCH 3/3] Fix LIT test failures

---
 llvm/include/llvm/ADT/PointerIntPair.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/llvm/include/llvm/ADT/PointerIntPair.h b/llvm/include/llvm/ADT/PointerIntPair.h
index 4ed711163b3ed..f92c57133dbc5 100644
--- a/llvm/include/llvm/ADT/PointerIntPair.h
+++ b/llvm/include/llvm/ADT/PointerIntPair.h
@@ -45,9 +45,8 @@ template <typename Ptr> struct PunnedPointer {
   constexpr operator intptr_t() const { return asInt(); }
 
   constexpr PunnedPointer &operator=(intptr_t V) {
-    if (reinterpret_cast<intptr_t>(Data) != V) {
+    if (asInt() != V)
       std::memcpy(Data, &V, sizeof(Data));
-    }
     return *this;
   }
 



More information about the cfe-commits mailing list