summaryrefslogtreecommitdiffstats
path: root/tests/diagnostics
diff options
context:
space:
mode:
authorCopilot <198982749+Copilot@users.noreply.github.com>2025-07-17 20:58:02 -0700
committerGitHub <noreply@github.com>2025-07-18 03:58:02 +0000
commit85edfb178cd243134f4bb3d35ad71f154d76c81c (patch)
tree68f5340c8796f6c2d5ff343cabf3d96c7d387ac5 /tests/diagnostics
parent447d73f8c2245d061b0e84890fb994a77816a736 (diff)
Add bounds checking for out-of-bounds array access with constant indices (#7814)
* Initial plan * Implement out-of-bounds array access checking Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Add tests and format code for array bounds checking Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Move checkForOutOfBoundAccess to separate file and refactor using InstPassBase Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Optimize out-of-bounds checker to use single IR traversal Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Fix DiagnosticSink forward declaration from struct to class Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Update 0-array-1 test to use runtime indices to avoid bounds checking diagnostic Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> * Use SV_DispatchThreadID for truly runtime array access in 0-array-1 test Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com>
Diffstat (limited to 'tests/diagnostics')
-rw-r--r--tests/diagnostics/array-out-of-bounds-2.slang29
-rw-r--r--tests/diagnostics/array-out-of-bounds.slang28
2 files changed, 57 insertions, 0 deletions
diff --git a/tests/diagnostics/array-out-of-bounds-2.slang b/tests/diagnostics/array-out-of-bounds-2.slang
new file mode 100644
index 000000000..978f61d9f
--- /dev/null
+++ b/tests/diagnostics/array-out-of-bounds-2.slang
@@ -0,0 +1,29 @@
+// array-out-of-bounds-2.slang
+
+// Test the specific scenario from the issue (array of size 3, accessing index 3)
+
+//TEST:SIMPLE(filecheck=CHECK): -target spirv -entry computeMain -stage compute
+
+struct SH3_t
+{
+ float coeffs[4];
+};
+
+RWStructuredBuffer<float> outputBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ SH3_t a[3];
+ SH3_t b;
+
+ for (int i = 0; i < 3; ++i)
+ {
+ // This should be fine
+ outputBuffer[i] = a[i].coeffs[0];
+ }
+
+ // This reproduces the issue - accessing index 3 in array of size 3
+ //CHECK: error 30029: array index '3' is out of bounds for array of size '3'.
+ outputBuffer[3] = a[3].coeffs[0];
+} \ No newline at end of file
diff --git a/tests/diagnostics/array-out-of-bounds.slang b/tests/diagnostics/array-out-of-bounds.slang
new file mode 100644
index 000000000..81c243031
--- /dev/null
+++ b/tests/diagnostics/array-out-of-bounds.slang
@@ -0,0 +1,28 @@
+// array-out-of-bounds.slang
+
+// Test that out-of-bounds array access with constant indices generates an error
+
+//TEST:SIMPLE(filecheck=CHECK): -target spirv -entry computeMain -stage compute
+
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int a[3];
+ a[0] = 10;
+ a[1] = 20;
+ a[2] = 30;
+
+ // Valid access - should be fine
+ outputBuffer[0] = a[0];
+ outputBuffer[1] = a[2];
+
+ // Invalid access - index 3 is out of bounds for array of size 3
+ //CHECK: error 30029: array index '3' is out of bounds for array of size '3'.
+ outputBuffer[2] = a[3];
+
+ // Invalid access - negative index
+ //CHECK: error 30029: array index '-1' is out of bounds for array of size '3'.
+ outputBuffer[3] = a[-1];
+} \ No newline at end of file