Mercurial > hg > xemacs-beta
comparison tests/reproduce-crashes.el @ 4345:748bbb699b0a
Rename reproduce-bugs.el to reproduce-crashes.el.
author | Stephen J. Turnbull <stephen@xemacs.org> |
---|---|
date | Fri, 21 Dec 2007 03:33:35 -0800 |
parents | tests/reproduce-bugs.el@2511b50f39c6 |
children | ec1103d2c1c7 |
comparison
equal
deleted
inserted
replaced
4344:2511b50f39c6 | 4345:748bbb699b0a |
---|---|
1 ;;; reproduce-bugs.el --- reproduce bugs in XEmacs | |
2 | |
3 ;; Copyright (C) 1997 Free Software Foundation, Inc. | |
4 ;; Copyright (C) 1997 Sun Microsystems, Inc. | |
5 | |
6 ;; Keywords: bugs, crash, burn, die, croak, munge | |
7 | |
8 ;; This file is part of XEmacs. | |
9 | |
10 ;; This file is free software; you can redistribute it and/or modify it | |
11 ;; under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; XEmacs is distributed in the hope that it will be useful, but | |
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 ;; General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with XEmacs; see the file COPYING. If not, write to the Free | |
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
23 ;; 02111-1307, USA. | |
24 | |
25 ;;; Synched up with: Not in FSF. | |
26 | |
27 ;;; Commentary: | |
28 | |
29 ;; Reproduce XEmacs crashes, so that they can get fixed. | |
30 ;; A table of bugs is created. You can list, describe, or reproduce bugs. | |
31 | |
32 ;; Non-crash bugs should not be in this file; they should be placed in | |
33 ;; an appropriate file in the tests/automated suite. | |
34 ;; You may need to use a debug version of XEmacs to reproduce some of these. | |
35 | |
36 ;; For XEmacs maintainers and other masochists. | |
37 ;; It's a bad idea to rely on code in this file continuing to work in | |
38 ;; the same way. :-) | |
39 | |
40 ;; #### This file should be cleaned up and renamed reproduce-crashes.el. | |
41 ;; #### Bugs < 11 need to be tested and versions where they pass recorded. | |
42 ;; #### Fixed bugs should become regression tests, maybe? | |
43 ;; #### Non-crashes should be copied (not moved) to tests/automatic. | |
44 ;; #### Do the autoloads make any sense? | |
45 ;; #### `list-bugs' should optionally sort on status. | |
46 ;; #### Bugs that depend on features (eg, Mule) should check for them and | |
47 ;; document them. | |
48 | |
49 ;;; Code: | |
50 | |
51 ;; UI entry points | |
52 | |
53 (defun reproduce-bug (number) | |
54 "Reproduce XEmacs bugs, so that they can get fixed. | |
55 Especially, make XEmacs crash. | |
56 See reproduce-bugs.el for bug descriptions and bug numbers. | |
57 A debug version of XEmacs may be needed to reproduce some bugs." | |
58 (interactive "nBug Number: ") | |
59 (funcall (nth 0 (gethash number bug-hashtable)))) | |
60 | |
61 (defun describe-bug (number &optional show-code) | |
62 "Describe the bug with index NUMBER in a popup window. | |
63 If optional argument SHOW-CODE is non-nil, also display the reproduction code." | |
64 (interactive "nBug number: \ncShow code? [y/N] ") | |
65 (setq show-code (cond ((not (interactive-p)) show-code) | |
66 ((member show-code '(?y ?Y)) t) | |
67 (t nil))) | |
68 (with-displaying-temp-buffer (format "Bug %d" number) | |
69 (let ((bug (gethash number bug-hashtable))) | |
70 (princ (format "Bug #%d is %s.\n%s\n\n%s" | |
71 number | |
72 (nth 1 bug) | |
73 (nth 2 bug) | |
74 (if show-code (pp-to-string (nth 0 bug)) "")))))) | |
75 | |
76 (defun list-bugs () | |
77 "List bugs most recent first, each with brief description in a popup window. | |
78 Assumes a maximum of 999 bugs and a minimum of 80 column width window." | |
79 (interactive) | |
80 (with-displaying-temp-buffer "*Bug list*" | |
81 (princ " # status description\n") | |
82 (let (buglist) | |
83 (maphash (lambda (number bug) | |
84 (push (format "%3d %-9s %s" | |
85 number | |
86 (nth 1 bug) | |
87 (let ((description (nth 2 bug))) | |
88 (save-match-data | |
89 (string-match "\\(.*\\)\\(\n\\|$\\)" | |
90 description) | |
91 (match-string 1 description)))) | |
92 buglist)) | |
93 bug-hashtable) | |
94 (setq buglist (sort buglist (lambda (b1 b2) (string< b2 b1)))) | |
95 (while buglist | |
96 (let ((bug (pop buglist))) | |
97 (princ (if (< (length bug) 79) bug (substring bug 0 78))) | |
98 (terpri)))))) | |
99 | |
100 ;; Database and utilities (internal) | |
101 | |
102 (defvar bug-hashtable (make-hashtable 10) | |
103 "Table of bugs, keyed by bug index number. | |
104 The value is a list (LAMBDA STATUS DOCSTRING), where LAMBDA is a lambda | |
105 expression reproducing the bug, and STATUS and DOCSTRING describe the bug. | |
106 For details, see `defbug'.") | |
107 | |
108 (put 'defbug 'lisp-indent-function 'defun) | |
109 (defmacro defbug (bug-number status docstring &rest body) | |
110 "Record a bug with key BUG-NUMBER and value (LAMBDA STATUS DOCSTRING). | |
111 LAMBDA is a lambda expression which when called executes BODY. | |
112 BUG-NUMBER is the bug's index number, a positive integer. | |
113 STATUS is the current status of the bug, one of | |
114 fixed The bug has been diagnosed and fixed. | |
115 diagnosed The bug has been localized but not fixed. | |
116 current The bug has been reported and reproduced but cause is unknown. | |
117 legacy The bug is undocumented but presumed fixed. | |
118 DOCSTRING should be a string describing the bug, including any relevant | |
119 descriptive information and references to archived mailing list traffic or | |
120 a BTS issue. | |
121 BODY is a sequence of expressions to execute to reproduce the bug." | |
122 (let ((body (if (stringp docstring) body (cons docstring body))) | |
123 (docstring (if (stringp docstring) docstring "[docstring omitted]"))) | |
124 `(puthash ,bug-number | |
125 '((lambda () ,@body) ,status ,docstring) | |
126 bug-hashtable))) | |
127 | |
128 (defconst bug-buffer | |
129 (save-excursion | |
130 (set-buffer (get-buffer-create "*Bug*")) | |
131 (erase-buffer) | |
132 (current-buffer))) | |
133 | |
134 | |
135 ;;; ------------------------------------------------------------------ | |
136 ;;;; Bugs follow: | |
137 | |
138 (defbug 11 fixed | |
139 "Crash in search due to backward movement. | |
140 Need Mule build with error checking in 21.5.28. | |
141 Fatal error: assertion failed, | |
142 file /Users/steve/Software/XEmacs/alioth/xemacs/src/search.c, line 1487, | |
143 (this_pos) > ((Bytebpos) 1) && this_pos <= ((buf)->text->z + 0) | |
144 Reported: <475B104F.2070807@barco.com> | |
145 <87hcixwkh4.fsf@uwakimon.sk.tsukuba.ac.jp> | |
146 Fixed: <87hcixwkh4.fsf@uwakimon.sk.tsukuba.ac.jp>" | |
147 (switch-to-buffer (get-buffer-create "*crash me*")) | |
148 ;; doozy is the keystroke equivalent of the keyboard macro | |
149 ;; "IAI" C-b C-b C-s C-x | |
150 (let ((doozy [;;(control ?x) ?b ?j ?u ?n ?k return | |
151 ?I ?A ?I | |
152 (control ?b) (control ?b) | |
153 (control ?s) (control ?w)])) | |
154 (execute-kbd-macro doozy))) | |
155 | |
156 | |
157 (defbug 10 current | |
158 "Crash on trace-function | |
159 Fatal error: assertion failed, file src/eval.c, line 1405, abort()" | |
160 (trace-function 'record-buffer bug-buffer) | |
161 (pop-to-buffer bug-buffer)) | |
162 | |
163 | |
164 (defbug 9 current | |
165 "Crashes with stack overflow | |
166 Should give error via barf-if-buffer-read-only | |
167 Fatal error: assertion failed, file src/eval.c, line 1874, abort() | |
168 This bug has been fixed. -sb" | |
169 (switch-to-buffer bug-buffer) | |
170 ;; The following line should contain a number of eight-bit characters | |
171 (insert "²èÌÌËè¤Î°ÜÆ°¤Ï¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£º£Å٤ϡ¢²èÌ̤ÎÃæ¤Ç¡¢ÆÃÄê¤Î¾ì") | |
172 (setq buffer-read-only t) | |
173 (ignore-errors | |
174 (encode-coding-region (point-min) (point-max) 'euc-japan)) | |
175 (garbage-collect)) | |
176 | |
177 | |
178 (defbug 8 current | |
179 "Crashes in debug version only | |
180 Fatal error: assertion failed, file src/objects.h, line 149, | |
181 RECORD_TYPEP (_obj, lrecord_font_instance) || MARKED_RECORD_P (_obj)" | |
182 (let (glyph ext) | |
183 (make-face 'adobe-symbol-face) | |
184 (set-face-font | |
185 'adobe-symbol-face | |
186 "-adobe-symbol-medium-r-normal--*-140-*-*-p-*-adobe-fontspecific") | |
187 (setq glyph (make-glyph (list (vector 'string | |
188 :data (char-to-string ?\xD3))))) | |
189 (set-glyph-face glyph 'adobe-symbol-face) | |
190 (setq ext (make-extent 14 18)) | |
191 (set-extent-property ext 'begin-glyph glyph))) | |
192 | |
193 | |
194 (defbug 7 current | |
195 "(maybe?) crash koi8 | |
196 ACCL: Invalid command (c) | |
197 With debugging on, crashes as follows: | |
198 Fatal error: assertion failed, file src/lisp.h, line 1227, INTP (obj)" | |
199 ;;(load "cyrillic") | |
200 ;;(load "cyrillic-hooks") | |
201 (princ (decode-coding-string "\xe1" 'koi8))) | |
202 | |
203 | |
204 (defbug 6 current | |
205 "regexp crash | |
206 This doesn't crash for me. -sb" | |
207 (string-match "\\(\\s-\\|$\\)" "å")) | |
208 | |
209 | |
210 (defbug 5 legacy | |
211 "`subst-char-in-region' moves point." | |
212 (interactive) | |
213 (with-temp-buffer | |
214 (insert "abc") | |
215 (forward-char -1) | |
216 (subst-char-in-region 1 4 ?b ?\344) | |
217 (if (not (= (point) 3)) | |
218 (message "Bug! point should equal 3 but is %d" (point))))) | |
219 | |
220 | |
221 (defbug 4 legacy | |
222 "Infinite recursion crash - Segmentation Fault" | |
223 (switch-to-buffer bug-buffer) | |
224 (insert "abcdefg") | |
225 (setq e (make-extent 1 4)) | |
226 (set-extent-property e 'face 'bold) | |
227 (set-extent-property e 'duplicable t) | |
228 (set-extent-property e 'replicating t) | |
229 (insert (buffer-string)) | |
230 (delete-region 8 9)) | |
231 | |
232 | |
233 (defbug 3 current | |
234 "Completely Uninterruptible hang in re-search-backward (Was: java-mode)" | |
235 (switch-to-buffer bug-buffer) | |
236 (insert "{ | |
237 public static void main(String[] args) throws java.io.IOException | |
238 { | |
239 } | |
240 } | |
241 ") | |
242 (goto-char (point-min)) | |
243 (search-forward "{" nil nil 2) | |
244 (backward-char) | |
245 (re-search-backward | |
246 "^\\s(\\|\\(^[ \t]*\\(\\(\\(public\\|protected\\|static\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\<throws\\>\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f]*\\)+\\)?\\s-*\\)\\s(")) | |
247 | |
248 | |
249 (defbug 2 legacy | |
250 "crash popup frames | |
251 FIXED | |
252 #### This bug is not understood, and may be incomplete. See source." | |
253 (lambda () | |
254 (let ((f (selected-frame))) | |
255 (make-frame `(popup ,(selected-frame))) | |
256 (make-frame) | |
257 (sit-for 0) | |
258 (delete-frame f) | |
259 ;; #### Check whether this is needed. | |
260 ;; (save-buffers-kill-emacs5) | |
261 ))) | |
262 | |
263 | |
264 (defbug 1 legacy | |
265 "crash on delete-frame-hook | |
266 FIXED! | |
267 #### This bug is not understood, and seems to be incomplete. See source." | |
268 (lambda () | |
269 ;; #### Should this be add-hook instead of setq? | |
270 (setq delete-frame-hook | |
271 (lambda (frame) | |
272 (select-frame frame) | |
273 (kill-buffer (window-buffer (frame-selected-window frame))) | |
274 ;; #### Do we need to delete a frame here or something? | |
275 )))) | |
276 | |
277 ;;; reproduce-bugs.el ends here |