mirror of
https://github.com/python/cpython.git
synced 2026-10-28 10:25:05 +08:00
[3.14] gh-159320: Enable stack size detection on Android (GH-159321) (#159410)
gh-159320: Enable stack size detection on Android (GH-159321)
Extend the use of pthread_getattr_np in stack size detection from any glibc linux to any glibc *or* android linux. Update tests for android's new recursion limit.
(cherry picked from commit 8ff41c2ae7)
Co-authored-by: T. Wouters <thomas@python.org>
Co-authored-by: Malcolm Smith <smith@chaquo.com>
This commit is contained in:
4 files changed
+14
-14
No files matched your search
@@ -1027,13 +1027,11 @@ class AST_Tests(unittest.TestCase):
|
||||
enum._test_simple_enum(_Precedence, _ast_unparse._Precedence)
|
||||
|
||||
@support.cpython_only
|
||||
@support.run_with_limited_c_stack(
|
||||
100_000 if sys.platform == "android" else 500_000)
|
||||
@support.run_with_limited_c_stack(500_000)
|
||||
@skip_wasi_stack_overflow()
|
||||
@skip_emscripten_stack_overflow()
|
||||
def test_ast_recursion_limit(self):
|
||||
# Android test devices have less memory.
|
||||
crash_depth = 100_000 if sys.platform == "android" else 500_000
|
||||
crash_depth = 500_000
|
||||
success_depth = 200
|
||||
if _testinternalcapi is not None:
|
||||
remaining = _testinternalcapi.get_c_recursion_remaining()
|
||||
|
||||
@@ -724,14 +724,12 @@ class TestSpecifics(unittest.TestCase):
|
||||
|
||||
@support.cpython_only
|
||||
@unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI")
|
||||
@support.run_with_limited_c_stack(
|
||||
100_000 if sys.platform == "android" else 500_000)
|
||||
@support.run_with_limited_c_stack(500_000)
|
||||
@support.skip_emscripten_stack_overflow()
|
||||
def test_compiler_recursion_limit(self):
|
||||
# Compiler frames are small
|
||||
limit = 100
|
||||
# Android test devices have less memory.
|
||||
crash_depth = limit * (1000 if sys.platform == "android" else 5000)
|
||||
crash_depth = limit * 5000
|
||||
success_depth = limit
|
||||
|
||||
def check_limit(prefix, repeated, mode="single"):
|
||||
@@ -1037,8 +1035,7 @@ class TestSpecifics(unittest.TestCase):
|
||||
# complex statements.
|
||||
@support.requires_resource('cpu')
|
||||
def test_stack_overflow(self):
|
||||
# Android test devices have less memory.
|
||||
size = 100_000 if sys.platform == "android" else 200_000
|
||||
size = 200_000
|
||||
compile("if a: b\n" * size, "<dummy>", "exec")
|
||||
|
||||
# Multiple users rely on the fact that CPython does not generate
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Add dynamic detection of stack sizes on Android, allowing safer deep
|
||||
recursion.
|
||||
+7
-4
@@ -457,11 +457,14 @@ hardware_stack_limits(uintptr_t *base, uintptr_t *top, uintptr_t sp)
|
||||
*top = (uintptr_t)stack_addr;
|
||||
*base = ((uintptr_t)stack_addr) - stack_size;
|
||||
#else
|
||||
/// XXX musl supports HAVE_PTHRED_GETATTR_NP, but the resulting stack size
|
||||
/// (on alpine at least) is much smaller than expected and imposes undue limits
|
||||
/// compared to the old stack size estimation. (We assume musl is not glibc.)
|
||||
// musl supports HAVE_PTHREAD_GETATTR_NP, but the resulting stack size
|
||||
// (on alpine at least) is much smaller than expected and imposes undue
|
||||
// limits compared to the old stack size estimation. musl doesn't give
|
||||
// us a way to detect it, so we have to assume any non-glibc,
|
||||
// non-Android Linux is musl and mustn't rely on pthread_getattr_np.
|
||||
# if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(_AIX) && \
|
||||
!defined(__NetBSD__) && (defined(__GLIBC__) || !defined(__linux__))
|
||||
!defined(__NetBSD__) && \
|
||||
(defined(__GLIBC__) || defined(__ANDROID__) || !defined(__linux__))
|
||||
size_t stack_size, guard_size;
|
||||
void *stack_addr;
|
||||
pthread_attr_t attr;
|
||||
|
||||
Reference in new issue
Block a user