Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/reproduce-crashes.el Fri Dec 21 03:33:35 2007 -0800 @@ -0,0 +1,277 @@ +;;; reproduce-bugs.el --- reproduce bugs in XEmacs + +;; Copyright (C) 1997 Free Software Foundation, Inc. +;; Copyright (C) 1997 Sun Microsystems, Inc. + +;; Keywords: bugs, crash, burn, die, croak, munge + +;; This file is part of XEmacs. + +;; This file is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Synched up with: Not in FSF. + +;;; Commentary: + +;; Reproduce XEmacs crashes, so that they can get fixed. +;; A table of bugs is created. You can list, describe, or reproduce bugs. + +;; Non-crash bugs should not be in this file; they should be placed in +;; an appropriate file in the tests/automated suite. +;; You may need to use a debug version of XEmacs to reproduce some of these. + +;; For XEmacs maintainers and other masochists. +;; It's a bad idea to rely on code in this file continuing to work in +;; the same way. :-) + +;; #### This file should be cleaned up and renamed reproduce-crashes.el. +;; #### Bugs < 11 need to be tested and versions where they pass recorded. +;; #### Fixed bugs should become regression tests, maybe? +;; #### Non-crashes should be copied (not moved) to tests/automatic. +;; #### Do the autoloads make any sense? +;; #### `list-bugs' should optionally sort on status. +;; #### Bugs that depend on features (eg, Mule) should check for them and +;; document them. + +;;; Code: + +;; UI entry points + +(defun reproduce-bug (number) + "Reproduce XEmacs bugs, so that they can get fixed. +Especially, make XEmacs crash. +See reproduce-bugs.el for bug descriptions and bug numbers. +A debug version of XEmacs may be needed to reproduce some bugs." + (interactive "nBug Number: ") + (funcall (nth 0 (gethash number bug-hashtable)))) + +(defun describe-bug (number &optional show-code) + "Describe the bug with index NUMBER in a popup window. +If optional argument SHOW-CODE is non-nil, also display the reproduction code." + (interactive "nBug number: \ncShow code? [y/N] ") + (setq show-code (cond ((not (interactive-p)) show-code) + ((member show-code '(?y ?Y)) t) + (t nil))) + (with-displaying-temp-buffer (format "Bug %d" number) + (let ((bug (gethash number bug-hashtable))) + (princ (format "Bug #%d is %s.\n%s\n\n%s" + number + (nth 1 bug) + (nth 2 bug) + (if show-code (pp-to-string (nth 0 bug)) "")))))) + +(defun list-bugs () + "List bugs most recent first, each with brief description in a popup window. +Assumes a maximum of 999 bugs and a minimum of 80 column width window." + (interactive) + (with-displaying-temp-buffer "*Bug list*" + (princ " # status description\n") + (let (buglist) + (maphash (lambda (number bug) + (push (format "%3d %-9s %s" + number + (nth 1 bug) + (let ((description (nth 2 bug))) + (save-match-data + (string-match "\\(.*\\)\\(\n\\|$\\)" + description) + (match-string 1 description)))) + buglist)) + bug-hashtable) + (setq buglist (sort buglist (lambda (b1 b2) (string< b2 b1)))) + (while buglist + (let ((bug (pop buglist))) + (princ (if (< (length bug) 79) bug (substring bug 0 78))) + (terpri)))))) + +;; Database and utilities (internal) + +(defvar bug-hashtable (make-hashtable 10) + "Table of bugs, keyed by bug index number. +The value is a list (LAMBDA STATUS DOCSTRING), where LAMBDA is a lambda +expression reproducing the bug, and STATUS and DOCSTRING describe the bug. +For details, see `defbug'.") + +(put 'defbug 'lisp-indent-function 'defun) +(defmacro defbug (bug-number status docstring &rest body) + "Record a bug with key BUG-NUMBER and value (LAMBDA STATUS DOCSTRING). +LAMBDA is a lambda expression which when called executes BODY. +BUG-NUMBER is the bug's index number, a positive integer. +STATUS is the current status of the bug, one of + fixed The bug has been diagnosed and fixed. + diagnosed The bug has been localized but not fixed. + current The bug has been reported and reproduced but cause is unknown. + legacy The bug is undocumented but presumed fixed. +DOCSTRING should be a string describing the bug, including any relevant +descriptive information and references to archived mailing list traffic or +a BTS issue. +BODY is a sequence of expressions to execute to reproduce the bug." + (let ((body (if (stringp docstring) body (cons docstring body))) + (docstring (if (stringp docstring) docstring "[docstring omitted]"))) + `(puthash ,bug-number + '((lambda () ,@body) ,status ,docstring) + bug-hashtable))) + +(defconst bug-buffer + (save-excursion + (set-buffer (get-buffer-create "*Bug*")) + (erase-buffer) + (current-buffer))) + + +;;; ------------------------------------------------------------------ +;;;; Bugs follow: + +(defbug 11 fixed + "Crash in search due to backward movement. +Need Mule build with error checking in 21.5.28. +Fatal error: assertion failed, +file /Users/steve/Software/XEmacs/alioth/xemacs/src/search.c, line 1487, +(this_pos) > ((Bytebpos) 1) && this_pos <= ((buf)->text->z + 0) +Reported: <475B104F.2070807@barco.com> + <87hcixwkh4.fsf@uwakimon.sk.tsukuba.ac.jp> +Fixed: <87hcixwkh4.fsf@uwakimon.sk.tsukuba.ac.jp>" + (switch-to-buffer (get-buffer-create "*crash me*")) + ;; doozy is the keystroke equivalent of the keyboard macro + ;; "IAI" C-b C-b C-s C-x + (let ((doozy [;;(control ?x) ?b ?j ?u ?n ?k return + ?I ?A ?I + (control ?b) (control ?b) + (control ?s) (control ?w)])) + (execute-kbd-macro doozy))) + + +(defbug 10 current + "Crash on trace-function +Fatal error: assertion failed, file src/eval.c, line 1405, abort()" + (trace-function 'record-buffer bug-buffer) + (pop-to-buffer bug-buffer)) + + +(defbug 9 current + "Crashes with stack overflow +Should give error via barf-if-buffer-read-only +Fatal error: assertion failed, file src/eval.c, line 1874, abort() +This bug has been fixed. -sb" + (switch-to-buffer bug-buffer) + ;; The following line should contain a number of eight-bit characters + (insert "²èÌÌËè¤Î°ÜÆ°¤Ï¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£º£Å٤ϡ¢²èÌ̤ÎÃæ¤Ç¡¢ÆÃÄê¤Î¾ì") + (setq buffer-read-only t) + (ignore-errors + (encode-coding-region (point-min) (point-max) 'euc-japan)) + (garbage-collect)) + + +(defbug 8 current + "Crashes in debug version only +Fatal error: assertion failed, file src/objects.h, line 149, +RECORD_TYPEP (_obj, lrecord_font_instance) || MARKED_RECORD_P (_obj)" + (let (glyph ext) + (make-face 'adobe-symbol-face) + (set-face-font + 'adobe-symbol-face + "-adobe-symbol-medium-r-normal--*-140-*-*-p-*-adobe-fontspecific") + (setq glyph (make-glyph (list (vector 'string + :data (char-to-string ?\xD3))))) + (set-glyph-face glyph 'adobe-symbol-face) + (setq ext (make-extent 14 18)) + (set-extent-property ext 'begin-glyph glyph))) + + +(defbug 7 current + "(maybe?) crash koi8 +ACCL: Invalid command (c) +With debugging on, crashes as follows: +Fatal error: assertion failed, file src/lisp.h, line 1227, INTP (obj)" + ;;(load "cyrillic") + ;;(load "cyrillic-hooks") + (princ (decode-coding-string "\xe1" 'koi8))) + + +(defbug 6 current + "regexp crash +This doesn't crash for me. -sb" + (string-match "\\(\\s-\\|$\\)" "å")) + + +(defbug 5 legacy + "`subst-char-in-region' moves point." + (interactive) + (with-temp-buffer + (insert "abc") + (forward-char -1) + (subst-char-in-region 1 4 ?b ?\344) + (if (not (= (point) 3)) + (message "Bug! point should equal 3 but is %d" (point))))) + + +(defbug 4 legacy + "Infinite recursion crash - Segmentation Fault" + (switch-to-buffer bug-buffer) + (insert "abcdefg") + (setq e (make-extent 1 4)) + (set-extent-property e 'face 'bold) + (set-extent-property e 'duplicable t) + (set-extent-property e 'replicating t) + (insert (buffer-string)) + (delete-region 8 9)) + + +(defbug 3 current + "Completely Uninterruptible hang in re-search-backward (Was: java-mode)" + (switch-to-buffer bug-buffer) + (insert "{ +public static void main(String[] args) throws java.io.IOException + { + } +} +") + (goto-char (point-min)) + (search-forward "{" nil nil 2) + (backward-char) + (re-search-backward + "^\\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(")) + + +(defbug 2 legacy + "crash popup frames +FIXED +#### This bug is not understood, and may be incomplete. See source." + (lambda () + (let ((f (selected-frame))) + (make-frame `(popup ,(selected-frame))) + (make-frame) + (sit-for 0) + (delete-frame f) + ;; #### Check whether this is needed. + ;; (save-buffers-kill-emacs5) + ))) + + +(defbug 1 legacy + "crash on delete-frame-hook +FIXED! +#### This bug is not understood, and seems to be incomplete. See source." + (lambda () + ;; #### Should this be add-hook instead of setq? + (setq delete-frame-hook + (lambda (frame) + (select-frame frame) + (kill-buffer (window-buffer (frame-selected-window frame))) + ;; #### Do we need to delete a frame here or something? + )))) + +;;; reproduce-bugs.el ends here