[clang] [HLSL] Prevent uninitialized on 2 int arguments (PR #173352)

Nathan Gauër via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 23 02:22:11 PST 2025


https://github.com/Keenuts created https://github.com/llvm/llvm-project/pull/173352

Unparsed HLSL semantics have 2 int/bool arguments with default values. Those values are loaded using checkUInt32Argument, and thus this should never fail.

But if something is wrong in the code above (or the def changed), this code wouldn't catch it and we'd read uninitialized integers. This commits checks both return values and assert if one fails. On release builds, this would early return, causing a bad codegen, but such change will be caught by tests.

>From bb52309a54ef3deaa73a314b683bf43dcc962973 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Tue, 23 Dec 2025 11:12:48 +0100
Subject: [PATCH] [HLSL] Prevent uninitialized on 2 int arguments

Unparsed HLSL semantics have 2 int/bool arguments with default
values. Those values are loaded using checkUInt32Argument, and thus
this should never fail.

But if something is wrong in the code above (or the def changed), this
code wouldn't catch it and we'd read uninitialized integers.
This commits checks both return values and assert if one fails.
On release builds, this would early return, causing a bad codegen, but
such change will be caught by tests.
---
 clang/lib/Sema/SemaHLSL.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 06130c985876f..0b1996b4789d6 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -1908,9 +1908,11 @@ void SemaHLSL::diagnoseSystemSemanticAttr(Decl *D, const ParsedAttr &AL,
 }
 
 void SemaHLSL::handleSemanticAttr(Decl *D, const ParsedAttr &AL) {
-  uint32_t IndexValue, ExplicitIndex;
-  SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(0), IndexValue);
-  SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(1), ExplicitIndex);
+  uint32_t IndexValue(0), ExplicitIndex(0);
+  if (!SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(0), IndexValue) ||
+      !SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(1), ExplicitIndex)) {
+    assert(0 && "HLSLUnparsedSemantic is expected to have 2 int arguments.");
+  }
   assert(IndexValue > 0 ? ExplicitIndex : true);
   std::optional<unsigned> Index =
       ExplicitIndex ? std::optional<unsigned>(IndexValue) : std::nullopt;



More information about the cfe-commits mailing list