]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add a crasher to Lib/test for issue #26153. This crasher doesn't crash (#6518)
authorT. Wouters <thomas@python.org>
Thu, 31 May 2018 10:22:11 +0000 (12:22 +0200)
committerGitHub <noreply@github.com>
Thu, 31 May 2018 10:22:11 +0000 (12:22 +0200)
Python 3.6, although I've seen the same crash in 3.6 (when involving
extension types and more complicated threading setups).

Lib/test/crashers/warnings_del_crasher.py [new file with mode: 0644]

diff --git a/Lib/test/crashers/warnings_del_crasher.py b/Lib/test/crashers/warnings_del_crasher.py
new file mode 100644 (file)
index 0000000..02e6805
--- /dev/null
@@ -0,0 +1,29 @@
+"""
+Expose a race in the _warnings module, which is the C backend for the
+warnings module. The "_warnings" module tries to access attributes of the
+"warnings" module (because of the API it has to support), but doing so
+during interpreter shutdown is problematic. Specifically, the call to
+PyImport_GetModuleDict() in Python/_warnings.c:get_warnings_attr will
+abort() if the modules dict has already been cleaned up.
+
+This crasher is timing-dependent, and more threads (NUM_THREADS) may be
+necessary to expose it reliably on different systems.
+"""
+
+import threading
+import warnings
+
+NUM_THREADS = 10
+
+class WarnOnDel(object):
+    def __del__(self):
+        warnings.warn("oh no something went wrong", UserWarning)
+
+def do_work():
+    while True:
+        w = WarnOnDel()
+
+for i in range(NUM_THREADS):
+    t = threading.Thread(target=do_work)
+    t.setDaemon(1)
+    t.start()