Skip to content

[asan,test] Make alloca_loop_unpoisoning.cpp robust and fix s390x failure #78774

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

MaskRay
Copy link
Member

@MaskRay MaskRay commented Jan 19, 2024

In the test from https://reviews.llvm.org/D7098, char array[len]; is
32-byte aligned on most targets whether it is instrumented or not
(optimized by StackSafetyAnalysis), due to the the used *FrameLowering
being StackRealignable.

However, when using SystemZELFFrameLowering, an un-instrumented
char array[len]; is only 8-byte aligned.

Ensure char array[len]; gets instrumented like what we did to
alloca_vla_interact.cpp, to make the test pass on s390x.

Created using spr 1.3.4
@llvmbot
Copy link
Member

llvmbot commented Jan 19, 2024

@llvm/pr-subscribers-compiler-rt-sanitizer

Author: Fangrui Song (MaskRay)

Changes

In the test from https://reviews.llvm.org/D7098, char array[len]; is
32-byte aligned on most targets whether it is instrumented or not
(optimized by StackSafetyAnalysis), due to the the used *FrameLowering
being StackRealignable.

However, when using SystemZELFFrameLowering, an un-instrumented
char array[len]; is only 8-byte aligned.

Ensure char array[len]; gets instrumented like what we did to
alloca_vla_interact.cpp, to make the test pass on s390x.


Full diff: https://github.com/llvm/llvm-project/pull/78774.diff

1 Files Affected:

  • (modified) compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp (+4-3)
diff --git a/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp b/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
index ac25a4faa2dc1b..bf84ab3d20d7de 100644
--- a/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
+++ b/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp
@@ -2,7 +2,6 @@
 // RUN: %env_asan_opts=detect_stack_use_after_return=0 %run %t 2>&1
 //
 // REQUIRES: stable-runtime
-// UNSUPPORTED: target=s390{{.*}}
 
 // This testcase checks that allocas and VLAs inside loop are correctly unpoisoned.
 
@@ -25,11 +24,13 @@ void *top, *bot;
 __attribute__((noinline)) void foo(int len) {
   char x;
   top = &x;
-  char array[len];
+  volatile char array[len];
+  if (len) array[0] = 0;
   assert(!(reinterpret_cast<uintptr_t>(array) & 31L));
   alloca(len);
   for (int i = 0; i < 32; ++i) {
-    char array[i];
+    volatile char array[i];
+    if (i) array[0] = 0;
     bot = alloca(i);
     assert(!(reinterpret_cast<uintptr_t>(bot) & 31L));
   }

Copy link

github-actions bot commented Jan 19, 2024

✅ With the latest revision this PR passed the C/C++ code formatter.

Copy link
Member

@uweigand uweigand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this works for me on SystemZ. LGTM, thanks!

Created using spr 1.3.4
@MaskRay MaskRay merged commit ebd4dc4 into main Jan 22, 2024
@MaskRay MaskRay deleted the users/MaskRay/spr/asantest-make-alloca_loop_unpoisoningcpp-robust-and-fix-s390x-failure branch January 22, 2024 16:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants