[clang] [Clang] Fix potential null pointer dereferences in Sema::AddInitializerToDecl (PR #94368)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 19 13:13:24 PDT 2024
https://github.com/smanna12 updated https://github.com/llvm/llvm-project/pull/94368
>From b6d45ded3d0d1ad6a50a1292d4f8275081089150 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Tue, 4 Jun 2024 08:33:51 -0700
Subject: [PATCH 1/9] [Clang] Fix potential null pointer dereferences in
Sema::AddInitializerToDecl
This patch adds null check for 'Init' before dereferencing it to prevent
potential null pointer dereferences reported by static Analyzer tool in
the function.
---
clang/lib/Sema/SemaDecl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 34e46e12859bb2..cd50df646b8b2b 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13728,7 +13728,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
// paths through the function. This should be revisited if
// -Wrepeated-use-of-weak is made flow-sensitive.
if (FunctionScopeInfo *FSI = getCurFunction())
- if ((VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
+ if (Init && (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
VDecl->getType().isNonWeakInMRRWithObjCWeak(Context)) &&
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
Init->getBeginLoc()))
>From 14d874cbfa18b321c15b5bea7409efc5aa388da2 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Tue, 4 Jun 2024 08:44:23 -0700
Subject: [PATCH 2/9] Fix Clang format errors
---
clang/lib/Sema/SemaDecl.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index cd50df646b8b2b..474e393de669c6 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13728,7 +13728,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
// paths through the function. This should be revisited if
// -Wrepeated-use-of-weak is made flow-sensitive.
if (FunctionScopeInfo *FSI = getCurFunction())
- if (Init && (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
+ if (Init &&
+ (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
VDecl->getType().isNonWeakInMRRWithObjCWeak(Context)) &&
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
Init->getBeginLoc()))
>From fc124205388bd5c87aa9848d9b7ba51476c83d8b Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Tue, 4 Jun 2024 09:31:09 -0700
Subject: [PATCH 3/9] Address review comments
---
clang/lib/Sema/SemaDecl.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 474e393de669c6..292236bf1a0ee1 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13681,6 +13681,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
Init = Result.getAs<Expr>();
+ assert (Init && "Init must not be null");
+
IsParenListInit = !InitSeq.steps().empty() &&
InitSeq.step_begin()->Kind ==
InitializationSequence::SK_ParenthesizedListInit;
@@ -13728,8 +13730,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
// paths through the function. This should be revisited if
// -Wrepeated-use-of-weak is made flow-sensitive.
if (FunctionScopeInfo *FSI = getCurFunction())
- if (Init &&
- (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
+ if ((VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
VDecl->getType().isNonWeakInMRRWithObjCWeak(Context)) &&
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
Init->getBeginLoc()))
>From 5b2da669506c49f4bdb2d9a6c53758c0f8480b72 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Tue, 4 Jun 2024 09:36:23 -0700
Subject: [PATCH 4/9] Fix clang format errors
---
clang/lib/Sema/SemaDecl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 292236bf1a0ee1..5439aedec08859 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13681,7 +13681,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
Init = Result.getAs<Expr>();
- assert (Init && "Init must not be null");
+ assert(Init && "Init must not be null");
IsParenListInit = !InitSeq.steps().empty() &&
InitSeq.step_begin()->Kind ==
>From 400d6851767aa675fe34dc509256d37089d22ee9 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Fri, 28 Jun 2024 14:18:13 -0700
Subject: [PATCH 5/9] Fix lit failure
---
clang/lib/Sema/SemaDecl.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 5439aedec08859..f13c9a3efc9e6b 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13687,8 +13687,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
InitSeq.step_begin()->Kind ==
InitializationSequence::SK_ParenthesizedListInit;
QualType VDeclType = VDecl->getType();
- if (Init && !Init->getType().isNull() &&
- !Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
+ if (!Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
Context.getAsIncompleteArrayType(VDeclType) &&
Context.getAsIncompleteArrayType(Init->getType())) {
// Bail out if it is not possible to deduce array size from the
>From 2b600b5a634933d4a82a7e538e0f53c551a0e986 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Fri, 2 Aug 2024 13:42:28 -0700
Subject: [PATCH 6/9] Remove assert
---
clang/lib/Sema/SemaDecl.cpp | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index f13c9a3efc9e6b..09ca04f66d2202 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13681,13 +13681,18 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
Init = Result.getAs<Expr>();
- assert(Init && "Init must not be null");
+
+ if (!Init) {
+ VDecl->setInvalidDecl();
+ return;
+ }
IsParenListInit = !InitSeq.steps().empty() &&
InitSeq.step_begin()->Kind ==
InitializationSequence::SK_ParenthesizedListInit;
QualType VDeclType = VDecl->getType();
- if (!Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
+ if (Init && !Init->getType().isNull() &&
+ !Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
Context.getAsIncompleteArrayType(VDeclType) &&
Context.getAsIncompleteArrayType(Init->getType())) {
// Bail out if it is not possible to deduce array size from the
>From 586c34d875d798cbc39710aefb0f8daf7819b6bc Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Mon, 19 Aug 2024 12:35:54 -0700
Subject: [PATCH 7/9] Address review comments
---
clang/lib/Sema/SemaDecl.cpp | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 09ca04f66d2202..d344f7b7eb1d29 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13477,7 +13477,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
// WebAssembly tables can't be used to initialise a variable.
- if (Init && !Init->getType().isNull() &&
+ if (!Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
Diag(Init->getExprLoc(), diag::err_wasm_table_art) << 0;
VDecl->setInvalidDecl();
@@ -13682,10 +13682,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
Init = Result.getAs<Expr>();
- if (!Init) {
- VDecl->setInvalidDecl();
- return;
- }
+ assert(Init && "Should have a valid initializer at this point");
IsParenListInit = !InitSeq.steps().empty() &&
InitSeq.step_begin()->Kind ==
>From 3e983f9fa3fae660be553b94380966951a649bf7 Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Mon, 19 Aug 2024 13:01:29 -0700
Subject: [PATCH 8/9] Address clang format issues
---
clang/lib/Sema/SemaDecl.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index d344f7b7eb1d29..4e0c5776839af9 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13477,8 +13477,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
// WebAssembly tables can't be used to initialise a variable.
- if (!Init->getType().isNull() &&
- Init->getType()->isWebAssemblyTableType()) {
+ if (!Init->getType().isNull() && Init->getType()->isWebAssemblyTableType()) {
Diag(Init->getExprLoc(), diag::err_wasm_table_art) << 0;
VDecl->setInvalidDecl();
return;
@@ -13688,7 +13687,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
InitSeq.step_begin()->Kind ==
InitializationSequence::SK_ParenthesizedListInit;
QualType VDeclType = VDecl->getType();
- if (Init && !Init->getType().isNull() &&
+ if (!Init->getType().isNull() &&
!Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
Context.getAsIncompleteArrayType(VDeclType) &&
Context.getAsIncompleteArrayType(Init->getType())) {
>From 9b0236f5e3dcf67294dfcf27a72a234d5977589c Mon Sep 17 00:00:00 2001
From: "Manna, Soumi" <soumi.manna at intel.com>
Date: Mon, 19 Aug 2024 13:13:01 -0700
Subject: [PATCH 9/9] Fix code
---
clang/lib/Sema/SemaDecl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 4e0c5776839af9..0e25ec639fb386 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13687,7 +13687,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
InitSeq.step_begin()->Kind ==
InitializationSequence::SK_ParenthesizedListInit;
QualType VDeclType = VDecl->getType();
- if (!Init->getType().isNull() &&
+ if (Init && !Init->getType().isNull() &&
!Init->getType()->isDependentType() && !VDeclType->isDependentType() &&
Context.getAsIncompleteArrayType(VDeclType) &&
Context.getAsIncompleteArrayType(Init->getType())) {
More information about the cfe-commits
mailing list