Mặc dù đã có rất nhiều nỗ lực khiến trình thông dịch Python gặp khó khăn hoặc không thể làm hỏng trình thông dịch trong cách sử dụng thông thường, nhưng có rất nhiều cách khá dễ dàng để làm hỏng trình thông dịch. BDFL được phát âm gần đây trên danh sách gửi thư python-dev
I'm not saying it's uncrashable. I'm saying that if you crash it, it's a bug unless proven harebrained.
Tôi nghĩ rằng có thể đáng để ghi lại một số cách trình thông dịch có thể bị lỗi - mặc dù hầu hết những cách này rất khó xảy ra trong mã thực
Ngoài ra còn có một thư mục trong kho lưu trữ SVN trình bày các cách đã biết để đánh sập Python
ctypes
def crash[]: '''\ crash the Python interpreter... ''' i = ctypes.c_char['a'] j = ctypes.pointer[i] c = 0 while True: j[c] = 'a' c += 1 j
từ pyl
đầu vào không có thật
Thông qua Python 2. 4, bạn có thể làm hỏng trình thông dịch bằng cách chuyển hướng stdin từ một thư mục
% python2.4 -c 'import sys ; print sys.version' 2.4.1 [#3, Jul 28 2005, 22:08:40] [GCC 3.3 20030304 [Apple Computer, Inc. build 1671]] % python2.4 < . Bus error
Bắt đầu với 2. 5 thông dịch viên thông báo và hủy bỏ
% python2.5 -c 'import sys ; print sys.version' 2.5a0 [41847M, Dec 29 2005, 22:21:03] [GCC 3.3 20030304 [Apple Computer, Inc. build 1671]] % python2.5 < . Fatal Python error: is a directory Abort trap
Một số mô-đun cũng không thực hiện kiểm tra nghiêm ngặt dữ liệu mà chúng hoạt động trên đó. Mô-đun soái ca có thể khiến nó làm hỏng trình thông dịch khi được cung cấp một số chuỗi nhất định
$ python Python 2.4.2 [#2, Sep 30 2005, 21:19:01] [GCC 4.0.2 20050808 [prerelease] [Ubuntu 4.0.1-4ubuntu8]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os, marshal >>> while True: .. try: .. marshal.loads[os.urandom[16]] .. except: .. pass .. Segmentation fault
Thực thi mã ngẫu nhiên, do trình thông dịch không xác minh tính đúng định dạng của đối tượng mã [opcodes không hợp lệ, kích thước ngăn xếp sai, v.v. ]. Đoạn mã sau được biết là làm sập python 2. 4. 3 trên Windows XP cũng như trên Linux
from types import CodeType as code exec code[0, 5, 8, 0, "hello moshe", [], [], [], "", "", 0, ""]
Cạn kiệt tài nguyên
Có một số lĩnh vực cạn kiệt tài nguyên có thể làm hỏng trình thông dịch. Đây là một cách khá dễ dàng để chứng minh để làm điều đó mặc dù
% python Python 2.5a0 [41847M, Dec 29 2005, 22:21:03] [GCC 3.3 20030304 [Apple Computer, Inc. build 1671]] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.setrecursionlimit[1> f = lambda f:f[f] >>> f[f] Segmentation fault
Một ví dụ phức tạp hơn một chút liên quan đến việc yêu cầu trình thông dịch sử dụng hết một số tài nguyên bên trong khi thực hiện một thao tác đơn lẻ
$ python Python 2.4.2 [#2, Sep 30 2005, 21:19:01] [GCC 4.0.2 20050808 [prerelease] [Ubuntu 4.0.1-4ubuntu8]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> f = lambda: None >>> for i in xrange[1000000]: .. f = f.__call__ .. >>> del f Segmentation fault
Tương tác GC/weakref
Tương tác giữa hai hệ thống này trong lịch sử là một điểm khó đối với CPython. Vẫn còn ít nhất một vấn đề trong Python 2. 4. 2
________số 8_______Mô-đun nguy hiểm
Một số mô-đun được thiết kế để cho phép các lập trình viên truy cập vào ruột của mọi thứ. Đương nhiên, chúng cũng tạo cơ hội cho các lập trình viên tự bắn vào chân mình. Ở đây có một ít
Mô-đun mới cho phép bạn xây dựng nhiều loại đối tượng khác nhau mà thông thường không thể tạo rõ ràng từ trình thông dịch. Ví dụ: bạn có thể tạo các đối tượng mã và cung cấp cho chúng các chuỗi tùy ý làm "mã byte" của chúng. Không biết thông dịch viên sẽ xử lý những hành vi lạm dụng như vậy thành công như thế nào
Mô-đun dl có sẵn trên nhiều hệ thống Unix. Nó cung cấp một giao diện mức thông dịch viên cho hàm dlopen[], cho phép bạn truy cập động vào các hàm trong các thư viện chia sẻ tùy ý. Không có kiểm tra nào được thực hiện đối với các đối số đối với các hàm bạn gọi. Do đó, sự vui nhộn có thể xảy ra. [Mô-đun ctypes, đang được xem xét để đưa vào Python 2. 5, cung cấp chức năng tương tự. ]
Nội dung bộ đệm cũng có thể nguy hiểm, vì theo lý thuyết, nó tuyên bố một tham chiếu đến một phạm vi bộ nhớ, nhưng làm như vậy mà không thông qua một đối tượng Python hoặc sử dụng hệ thống đếm ngược Python tiêu chuẩn. Điều này có thể nhìn thấy khi, ví dụ, xây dựng một bộ đệm từ một mảng. mảng, sau đó thay đổi kích thước mảng sao cho nó thực sự cấp phát [] bên trong bộ nhớ của nó, di chuyển bộ nhớ trong quá trình. Bộ đệm bây giờ sẽ đề cập đến một con trỏ không hợp lệ
Mô-đun gc có thể được thao tác để cấp quyền truy cập vào đối tượng được xây dựng một phần, việc truy cập vào các trường có thể gây ra sự cố
đa luồng
Một số mô-đun [hay đúng hơn là các đối tượng trong chúng] có thể gây ra sự cố nếu chúng được sử dụng không đúng cách trong nhiều luồng;
* Đề cập đến cùng một kết nối MySQLdb, có thể gây ra lỗi Phân đoạn
Khác
Tôi có cách khác
Tôi đã viết trình soạn thảo Tkinter GUI [được gọi là "GWiz"] để giúp tôi tạo và duy trì Tk GUI cho các dự án của riêng mình. [Bản thân trình soạn thảo cũng là một dự án GWiz. ] Trong một số trường hợp, tôi đã quên đóng GUI do GWiz tạo trước khi thoát. D. L. E. và Python [always?] gặp sự cố khi thoát với trình yêu cầu lỗi "ứng dụng đã yêu cầu chấm dứt bất thường". Khi tôi nhớ đóng ứng dụng của mình trước khi đóng, tôi. D. L. E. , mọi thứ biến mất sạch sẽ. Tôi nên thêm mã vào GWiz để làm sys. atexit[] dọn dẹp, nhưng tôi không biết cách hủy đăng ký các cuộc gọi lại của atexit; . Tôi có thể đăng các sửa đổi cho mô-đun thư viện, nếu ai đó sẽ cho tôi biết nơi đăng chúng