浏览代码

Avoid crash in ilist_node getPrev/getNext when Next/Prev is null (#3003)

Tex Riddell 5 年之前
父节点
当前提交
e00cc63096
共有 2 个文件被更改,包括 19 次插入4 次删除
  1. 4 4
      include/llvm/ADT/ilist_node.h
  2. 15 0
      tools/clang/test/HLSLFileCheck/validation/no_return_unreachable.hlsl

+ 4 - 4
include/llvm/ADT/ilist_node.h

@@ -59,7 +59,7 @@ public:
     NodeTy *Prev = this->getPrev();
 
     // Check for sentinel.
-    if (!Prev->getNext())
+    if (Prev && !Prev->getNext()) // HLSL Change: Prev may be nullptr
       return nullptr;
 
     return Prev;
@@ -70,7 +70,7 @@ public:
     const NodeTy *Prev = this->getPrev();
 
     // Check for sentinel.
-    if (!Prev->getNext())
+    if (Prev && !Prev->getNext()) // HLSL Change: Prev may be nullptr
       return nullptr;
 
     return Prev;
@@ -81,7 +81,7 @@ public:
     NodeTy *Next = getNext();
 
     // Check for sentinel.
-    if (!Next->getNext())
+    if (Next && !Next->getNext()) // HLSL Change: Next may be nullptr
       return nullptr;
 
     return Next;
@@ -92,7 +92,7 @@ public:
     const NodeTy *Next = getNext();
 
     // Check for sentinel.
-    if (!Next->getNext())
+    if (Next && !Next->getNext()) // HLSL Change: Next may be nullptr
       return nullptr;
 
     return Next;

+ 15 - 0
tools/clang/test/HLSLFileCheck/validation/no_return_unreachable.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxilver 1.6 | %dxc -T lib_6_3 -Wno-return-type %s | FileCheck %s
+
+// disable return-type warning (that defaults to error) to catch
+// validation case that would crash before HLSL Change to ilist_node
+// preventing deref of Prev nullptr.
+
+// CHECK: error: Instructions must be of an allowed type.
+// CHECK: note: at 'unreachable' in block
+// CHECK-SAME: of function
+// CHECK-SAME: no_return
+
+export float4 no_return() {
+  float4 f = 1.0;
+  f += 2.0;
+}