""" The gc module can still invoke arbitrary Python code and crash. This is an attack against _PyInstance_Lookup(), which is documented as follows: The point of this routine is that it never calls arbitrary Python code, so is always "safe": all it does is dict lookups. But of course dict lookups can call arbitrary Python code. The following code causes mutation of the object graph during the call to has_finalizer() in gcmodule.c, and that might segfault. """ import gc class A: def __hash__(self): return hash("__del__") def __eq__(self, other): del self.other return False a = A() b = A() a.__dict__[b] = 'A' a.other = b b.other = a gc.collect() del a, b gc.collect()