[libcxx-commits] [libcxx] [libc++][Android] Disable fdsan in filebuf close.pass.cpp (PR #102412)

Ryan Prichard via libcxx-commits libcxx-commits at lists.llvm.org
Tue Dec 3 15:47:45 PST 2024


https://github.com/rprichard updated https://github.com/llvm/llvm-project/pull/102412

>From 061580bc8cc06dc0888f3223decd7a104f2eb1a5 Mon Sep 17 00:00:00 2001
From: Ryan Prichard <rprichard at google.com>
Date: Wed, 7 Aug 2024 18:29:04 -0700
Subject: [PATCH 1/3] [libc++][Android] Disable fdsan in close.pass.cpp

fdsan is Bionic's "File Descriptor Sanitizer". Starting in API 30+, it
aborts this close.pass.cpp test, because it closes the FD belonging to
std::filebuf's FILE*. Use an fdsan API to suppress the diagnostic.
---
 .../fstreams/filebuf.members/close.pass.cpp   | 20 ++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
index e0338e6f619b71..fa2b3415b3cd35 100644
--- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
+++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
@@ -10,11 +10,6 @@
 
 // basic_filebuf<charT,traits>* close();
 
-// This test closes an fd that belongs to a std::filebuf, and Bionic's fdsan
-// detects this and aborts the process, starting in Android R (API 30).
-// See D137129.
-// XFAIL: LIBCXX-ANDROID-FIXME && !android-device-api={{2[1-9]}}
-
 #include <fstream>
 #include <cassert>
 #if defined(__unix__)
@@ -24,6 +19,14 @@
 #include "test_macros.h"
 #include "platform_support.h"
 
+// If we're building for a lower __ANDROID_API__, the Bionic versioner will
+// omit the function declarations from fdsan.h. We might be running on a newer
+// API level, though, so declare the API function here using weak.
+#if defined(__BIONIC__)
+#include <android/fdsan.h>
+enum android_fdsan_error_level android_fdsan_set_error_level(enum android_fdsan_error_level new_level) __attribute__((weak));
+#endif
+
 int main(int, char**)
 {
     std::string temp = get_temp_file_name();
@@ -37,6 +40,13 @@ int main(int, char**)
         assert(f.close() == nullptr);
         assert(!f.is_open());
     }
+#if defined(__BIONIC__)
+    // Starting with Android API 30+, Bionic's fdsan aborts a process that
+    // attempts to close a file descriptor belonging to something else. Disable
+    // fdsan to allow closing the FD belonging to std::filebuf's FILE*.
+    if (android_fdsan_set_error_level != nullptr)
+        android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_DISABLED);
+#endif
 #if defined(__unix__)
     {
         std::filebuf f;

>From 285d243972a6ad9bd8560067221d5b79cf41f879 Mon Sep 17 00:00:00 2001
From: Ryan Prichard <rprichard at google.com>
Date: Wed, 7 Aug 2024 19:08:47 -0700
Subject: [PATCH 2/3] formatting

---
 .../file.streams/fstreams/filebuf.members/close.pass.cpp       | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
index fa2b3415b3cd35..15fdf6a11661e1 100644
--- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
+++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
@@ -24,7 +24,8 @@
 // API level, though, so declare the API function here using weak.
 #if defined(__BIONIC__)
 #include <android/fdsan.h>
-enum android_fdsan_error_level android_fdsan_set_error_level(enum android_fdsan_error_level new_level) __attribute__((weak));
+enum android_fdsan_error_level android_fdsan_set_error_level(enum android_fdsan_error_level new_level)
+    __attribute__((weak));
 #endif
 
 int main(int, char**)

>From 282569854e0796e1a0f3aa12608e9a7fb3237418 Mon Sep 17 00:00:00 2001
From: Ryan Prichard <rprichard at google.com>
Date: Tue, 3 Dec 2024 15:37:56 -0800
Subject: [PATCH 3/3] Skip part of the test for `__BIONIC__`

---
 .../fstreams/filebuf.members/close.pass.cpp   | 21 ++++---------------
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
index 15fdf6a11661e1..43233decf1b34f 100644
--- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
+++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/close.pass.cpp
@@ -19,15 +19,6 @@
 #include "test_macros.h"
 #include "platform_support.h"
 
-// If we're building for a lower __ANDROID_API__, the Bionic versioner will
-// omit the function declarations from fdsan.h. We might be running on a newer
-// API level, though, so declare the API function here using weak.
-#if defined(__BIONIC__)
-#include <android/fdsan.h>
-enum android_fdsan_error_level android_fdsan_set_error_level(enum android_fdsan_error_level new_level)
-    __attribute__((weak));
-#endif
-
 int main(int, char**)
 {
     std::string temp = get_temp_file_name();
@@ -41,14 +32,10 @@ int main(int, char**)
         assert(f.close() == nullptr);
         assert(!f.is_open());
     }
-#if defined(__BIONIC__)
-    // Starting with Android API 30+, Bionic's fdsan aborts a process that
-    // attempts to close a file descriptor belonging to something else. Disable
-    // fdsan to allow closing the FD belonging to std::filebuf's FILE*.
-    if (android_fdsan_set_error_level != nullptr)
-        android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_DISABLED);
-#endif
-#if defined(__unix__)
+    // Starting with Android API 30+, Bionic's fdsan aborts a process that calls
+    // close() on a file descriptor tagged as belonging to something else (such
+    // as a FILE*).
+#if defined(__unix__) && !defined(__BIONIC__)
     {
         std::filebuf f;
         assert(!f.is_open());



More information about the libcxx-commits mailing list