From 5364e2e46f7566e1917d013f83c431a72de76009 Mon Sep 17 00:00:00 2001 From: Armin Rigo Date: Fri, 25 Apr 2008 09:35:18 +0000 Subject: [PATCH] A new crasher. --- Lib/test/crashers/mutation_inside_cyclegc.py | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Lib/test/crashers/mutation_inside_cyclegc.py diff --git a/Lib/test/crashers/mutation_inside_cyclegc.py b/Lib/test/crashers/mutation_inside_cyclegc.py new file mode 100644 index 0000000000..2b67398bcc --- /dev/null +++ b/Lib/test/crashers/mutation_inside_cyclegc.py @@ -0,0 +1,31 @@ + +# The cycle GC collector can be executed when any GC-tracked object is +# allocated, e.g. during a call to PyList_New(), PyDict_New(), ... +# Moreover, it can invoke arbitrary Python code via a weakref callback. +# This means that there are many places in the source where an arbitrary +# mutation could unexpectedly occur. + +# The example below shows list_slice() not expecting the call to +# PyList_New to mutate the input list. (Of course there are many +# more examples like this one.) + + +import weakref + +class A(object): + pass + +def callback(x): + del lst[:] + + +keepalive = [] + +for i in range(100): + lst = [str(i)] + a = A() + a.cycle = a + keepalive.append(weakref.ref(a, callback)) + del a + while lst: + keepalive.append(lst[:]) -- 2.40.0