[clang] d2738c0 - Fix crash in 'malloc' referring to function without a argument (#159371)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 17 08:13:49 PDT 2025
Author: Erich Keane
Date: 2025-09-17T15:13:44Z
New Revision: d2738c0690c3fd6a10fc1ae8c5e1ec9345d06b2d
URL: https://github.com/llvm/llvm-project/commit/d2738c0690c3fd6a10fc1ae8c5e1ec9345d06b2d
DIFF: https://github.com/llvm/llvm-project/commit/d2738c0690c3fd6a10fc1ae8c5e1ec9345d06b2d.diff
LOG: Fix crash in 'malloc' referring to function without a argument (#159371)
As reported in #159080, patch #68059 didn't correctly check for the
argument count of the target function from malloc to ensure it has an
argument. This patch corrects that check.
Fixes: #159080
---------
Co-authored-by: Sergei Barannikov <barannikov88 at gmail.com>
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDeclAttr.cpp
clang/test/Sema/attr-args.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 80f4e83a11b70..c732b9ea74519 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -347,6 +347,9 @@ Bug Fixes in This Version
``-Wshadow`` and show uncaptured-local warnings with ``-Wshadow-all``. (#GH68605)
- Fixed a failed assertion with a negative limit parameter value inside of
``__has_embed``. (#GH157842)
+- Fixed an assertion when an improper use of the ``malloc`` attribute targeting
+ a function without arguments caused us to try to access a non-existent argument.
+ (#GH159080)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 44906456f3371..b6ebe54764282 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -1802,7 +1802,11 @@ static void handleRestrictAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
if (AL.getNumArgs() == 1) {
DeallocPtrIdx = ParamIdx(1, DeallocFD);
- if (!DeallocPtrIdx.isValid() ||
+ // FIXME: We could probably be better about diagnosing that there IS no
+ // argument, or that the function doesn't have a prototype, but this is how
+ // GCC diagnoses this, and is reasonably clear.
+ if (!DeallocPtrIdx.isValid() || !hasFunctionProto(DeallocFD) ||
+ getFunctionOrMethodNumParams(DeallocFD) < 1 ||
!getFunctionOrMethodParamType(DeallocFD, DeallocPtrIdx.getASTIndex())
.getCanonicalType()
->isPointerType()) {
diff --git a/clang/test/Sema/attr-args.c b/clang/test/Sema/attr-args.c
index 23815f3a4e675..01bfcc1951cd8 100644
--- a/clang/test/Sema/attr-args.c
+++ b/clang/test/Sema/attr-args.c
@@ -29,3 +29,9 @@ __attribute__ ((__format_arg__(2))) // expected-error {{'__format_arg__' attribu
void test (int, ...);
void __attribute__ ((alloc_size (2, 3))) *test2(int, ...); // expected-error {{'alloc_size' attribute parameter 1 is out of bounds}}
+
+void gh159080_a(void);
+void *gh159080_b(void) __attribute__((malloc(gh159080_a))); // expected-error{{'malloc' argument 'gh159080_a' must take a pointer type as its first argument}}
+void gh159080_c();
+void *gh159080_d(void) __attribute__((malloc(gh159080_c))); // expected-error{{'malloc' argument 'gh159080_c' must take a pointer type as its first argument}}
+
More information about the cfe-commits
mailing list