mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
collected my segfaulting Python examples from the SF trackers
(is the purpose of the crashers directory to scare people? :-)
This commit is contained in:
parent
f60cd47f10
commit
b4b5a7601b
8 changed files with 99 additions and 0 deletions
12
Lib/test/crashers/dangerous_subclassing.py
Normal file
12
Lib/test/crashers/dangerous_subclassing.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1174712
|
||||||
|
|
||||||
|
import types
|
||||||
|
|
||||||
|
class X(types.ModuleType, str):
|
||||||
|
"""Such a subclassing is incorrectly allowed --
|
||||||
|
see the SF bug report for explanations"""
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
X('name') # segfault: ModuleType.__init__() reads
|
||||||
|
# the dict at the wrong offset
|
||||||
11
Lib/test/crashers/infinite_rec_1.py
Normal file
11
Lib/test/crashers/infinite_rec_1.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1202533
|
||||||
|
|
||||||
|
import new, operator
|
||||||
|
|
||||||
|
class A:
|
||||||
|
pass
|
||||||
|
A.__mul__ = new.instancemethod(operator.mul, None, A)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
A()*2 # segfault: infinite recursion in C
|
||||||
10
Lib/test/crashers/infinite_rec_2.py
Normal file
10
Lib/test/crashers/infinite_rec_2.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1202533
|
||||||
|
|
||||||
|
class A(str):
|
||||||
|
__get__ = getattr
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
a = A('a')
|
||||||
|
A.a = a
|
||||||
|
a.a # segfault: infinite recursion in C
|
||||||
9
Lib/test/crashers/infinite_rec_3.py
Normal file
9
Lib/test/crashers/infinite_rec_3.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1202533
|
||||||
|
|
||||||
|
class A(object):
|
||||||
|
pass
|
||||||
|
A.__call__ = A()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
A()() # segfault: infinite recursion in C
|
||||||
7
Lib/test/crashers/infinite_rec_4.py
Normal file
7
Lib/test/crashers/infinite_rec_4.py
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1202533
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
lst = [apply]
|
||||||
|
lst.append(lst)
|
||||||
|
apply(*lst) # segfault: infinite recursion in C
|
||||||
10
Lib/test/crashers/infinite_rec_5.py
Normal file
10
Lib/test/crashers/infinite_rec_5.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1267884
|
||||||
|
|
||||||
|
import types
|
||||||
|
|
||||||
|
class C:
|
||||||
|
__str__ = types.InstanceType.__str__
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
str(C()) # segfault: infinite recursion in C
|
||||||
21
Lib/test/crashers/loosing_dict_ref.py
Normal file
21
Lib/test/crashers/loosing_dict_ref.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1303614
|
||||||
|
|
||||||
|
class Strange(object):
|
||||||
|
def __hash__(self):
|
||||||
|
return hash('hello')
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
x.__dict__ = {} # the old x.__dict__ is deallocated
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class X(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
v = 123
|
||||||
|
x = X()
|
||||||
|
x.__dict__ = {Strange(): 42,
|
||||||
|
'hello': v+456}
|
||||||
|
x.hello # segfault: the above dict is accessed after it's deallocated
|
||||||
19
Lib/test/crashers/modify_dict_attr.py
Normal file
19
Lib/test/crashers/modify_dict_attr.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
# http://python.org/sf/1303614
|
||||||
|
|
||||||
|
class Y(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class type_with_modifiable_dict(Y, type):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MyClass(object):
|
||||||
|
"""This class has its __dict__ attribute completely exposed:
|
||||||
|
user code can read, reassign and even delete it.
|
||||||
|
"""
|
||||||
|
__metaclass__ = type_with_modifiable_dict
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
del MyClass.__dict__ # if we set tp_dict to NULL,
|
||||||
|
print MyClass # doing anything with MyClass segfaults
|
||||||
Loading…
Add table
Add a link
Reference in a new issue