[libc-commits] [libc] 1e7624c - [libc] Make LlvmLibcStackChkFail.Smash test compatible with asan, hwasan (#125763)

via libc-commits libc-commits at lists.llvm.org
Tue Feb 4 13:42:26 PST 2025


Author: Roland McGrath
Date: 2025-02-04T13:42:23-08:00
New Revision: 1e7624ca4f3c9df14242b532eeb9497c67bc4074

URL: https://github.com/llvm/llvm-project/commit/1e7624ca4f3c9df14242b532eeb9497c67bc4074
DIFF: https://github.com/llvm/llvm-project/commit/1e7624ca4f3c9df14242b532eeb9497c67bc4074.diff

LOG: [libc] Make LlvmLibcStackChkFail.Smash test compatible with asan, hwasan (#125763)

Previously this test was entirely disabled under asan, but not
hwasan.  Instead of disabling the test, make the test compatible
with both asan and hwasan by disabling sanitizers only on the
subroutine that does the stack-smashing.

Added: 
    

Modified: 
    libc/test/src/compiler/stack_chk_guard_test.cpp

Removed: 
    


################################################################################
diff  --git a/libc/test/src/compiler/stack_chk_guard_test.cpp b/libc/test/src/compiler/stack_chk_guard_test.cpp
index 4ec8398c9fc95d..d1869a2af412e4 100644
--- a/libc/test/src/compiler/stack_chk_guard_test.cpp
+++ b/libc/test/src/compiler/stack_chk_guard_test.cpp
@@ -12,19 +12,24 @@
 #include "src/string/memset.h"
 #include "test/UnitTest/Test.h"
 
+namespace {
+
 TEST(LlvmLibcStackChkFail, Death) {
   EXPECT_DEATH([] { __stack_chk_fail(); }, WITH_SIGNAL(SIGABRT));
 }
 
-// Disable the test when asan is enabled so that it doesn't immediately fail
-// after the memset, but before the stack canary is re-checked.
-#ifndef LIBC_HAS_ADDRESS_SANITIZER
+// Disable sanitizers such as asan and hwasan that would catch the buffer
+// overrun before it clobbered the stack canary word.  Function attributes
+// can't be applied to lambdas before C++23, so this has to be separate.  When
+// https://github.com/llvm/llvm-project/issues/125760 is fixed, this can use
+// the modern spelling [[gnu::no_sanitize(...)]] without conditionalization.
+__attribute__((no_sanitize("all"))) void smash_stack() {
+  int arr[20];
+  LIBC_NAMESPACE::memset(arr, 0xAA, 2001);
+}
+
 TEST(LlvmLibcStackChkFail, Smash) {
-  EXPECT_DEATH(
-      [] {
-        int arr[20];
-        LIBC_NAMESPACE::memset(arr, 0xAA, 2001);
-      },
-      WITH_SIGNAL(SIGABRT));
+  EXPECT_DEATH(smash_stack, WITH_SIGNAL(SIGABRT));
 }
-#endif // LIBC_HAS_ADDRESS_SANITIZER
+
+} // namespace


        


More information about the libc-commits mailing list