From: Antoine Pitrou Date: Sat, 13 Sep 2008 20:30:30 +0000 (+0000) Subject: Issue #3850: Misc/find_recursionlimit.py was broken. X-Git-Tag: v2.6rc2~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3c9f541ef898207a907ad396a3e015255a2794a4;p=python Issue #3850: Misc/find_recursionlimit.py was broken. Reviewed by A.M. Kuchling. --- diff --git a/Misc/NEWS b/Misc/NEWS index f83a0dd64e..75cc88fc74 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -15,6 +15,14 @@ Core and Builtins Library ------- +Tools/Demos +----------- + +- Issue #3850: recursion tests in Misc/find_recursion_limit.py can raise + AttributeError instead of RuntimeError, depending in which C API call + exactly the recursion limit is exceeded. Consequently, both exception types + are caught and silenced. + What's New in Python 2.6 release candidate 1? ============================================= diff --git a/Misc/find_recursionlimit.py b/Misc/find_recursionlimit.py index 398abebc16..88e9bb58bc 100644 --- a/Misc/find_recursionlimit.py +++ b/Misc/find_recursionlimit.py @@ -1,22 +1,30 @@ #! /usr/bin/env python -"""Find the maximum recursion limit that prevents core dumps +"""Find the maximum recursion limit that prevents interpreter termination. This script finds the maximum safe recursion limit on a particular platform. If you need to change the recursion limit on your system, this script will tell you a safe upper bound. To use the new limit, -call sys.setrecursionlimit. +call sys.setrecursionlimit(). This module implements several ways to create infinite recursion in Python. Different implementations end up pushing different numbers of C stack frames, depending on how many calls through Python's abstract C API occur. -After each round of tests, it prints a message -Limit of NNNN is fine. +After each round of tests, it prints a message: +"Limit of NNNN is fine". -It ends when Python causes a segmentation fault because the limit is -too high. On platforms like Mac and Windows, it should exit with a -MemoryError. +The highest printed value of "NNNN" is therefore the highest potentially +safe limit for your system (which depends on the OS, architecture, but also +the compilation flags). Please note that it is practically impossible to +test all possible recursion paths in the interpreter, so the results of +this test should not be trusted blindly -- although they give a good hint +of which values are reasonable. + +NOTE: When the C stack space allocated by your system is exceeded due +to excessive recursion, exact behaviour depends on the platform, although +the interpreter will always fail in a likely brutal way: either a +segmentation fault, a MemoryError, or just a silent abort. NB: A program that does not use __methods__ can set a higher limit. """ @@ -88,7 +96,10 @@ def check_limit(n, test_func_name): test_func = globals()[test_func_name] try: test_func() - except RuntimeError: + # AttributeError can be raised because of the way e.g. PyDict_GetItem() + # silences all exceptions and returns NULL, which is usually interpreted + # as "missing attribute". + except (RuntimeError, AttributeError): pass else: print "Yikes!"