From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dan Nicolaescu Newsgroups: gmane.emacs.devel Subject: Problem report #17 Date: Sat, 20 May 2006 11:01:30 -0700 Message-ID: <200605201801.k4KI1UV0003504@scanner2.ics.uci.edu> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1148150291 24318 80.91.229.2 (20 May 2006 18:38:11 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 20 May 2006 18:38:11 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat May 20 20:38:09 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FhWL1-0000r7-E5 for ged-emacs-devel@m.gmane.org; Sat, 20 May 2006 20:38:07 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FhWL1-00053N-1q for ged-emacs-devel@m.gmane.org; Sat, 20 May 2006 14:38:07 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FhWKM-0004gN-JT for emacs-devel@gnu.org; Sat, 20 May 2006 14:37:26 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FhWKL-0004fw-OV for emacs-devel@gnu.org; Sat, 20 May 2006 14:37:26 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FhWKL-0004fo-EP for emacs-devel@gnu.org; Sat, 20 May 2006 14:37:25 -0400 Original-Received: from [128.195.1.36] (helo=scanner2.ics.uci.edu) by monty-python.gnu.org with esmtp (Exim 4.52) id 1FhWNw-0003Xn-2Z for emacs-devel@gnu.org; Sat, 20 May 2006 14:41:08 -0400 Original-Received: from vino.ics.uci.edu (vino.ics.uci.edu [128.195.11.198]) by scanner2.ics.uci.edu (8.13.6/8.13.5) with ESMTP id k4KI1UV0003504 for ; Sat, 20 May 2006 11:01:31 -0700 (PDT) Original-To: emacs-devel@gnu.org Original-Lines: 156 X-ICS-MailScanner: Found to be clean X-ICS-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (score=-1.286, required 5, autolearn=disabled, ALL_TRUSTED -1.44, TW_VG 0.08, TW_XL 0.08) X-ICS-MailScanner-From: dann@vino.ics.uci.edu X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:54883 Archived-At: This one appeared on May 15th, and it seems to be related to the crashes reported on the pretest list. Can somebody please take a look? CID: 17 Checker: FORWARD_NULL (help) File: base/src/emacs/src/xfaces.c Function: best_matching_font Description: Variable "best" tracked as NULL was dereferenced. 6591 static char * 6592 best_matching_font (f, attrs, fonts, nfonts, width_ratio, needs_overstrike) 6593 struct frame *f; 6594 Lisp_Object *attrs; 6595 struct font_name *fonts; 6596 int nfonts; 6597 int width_ratio; 6598 int *needs_overstrike; 6599 { 6600 char *font_name; 6601 struct font_name *best; 6602 int i, pt = 0; 6603 int specified[5]; 6604 int exact_p, avgwidth; 6605 6606 if (nfonts == 0) 6607 return NULL; 6608 6609 /* Make specified font attributes available in `specified', 6610 indexed by sort order. */ 6611 for (i = 0; i < DIM (font_sort_order); ++i) 6612 { 6613 int xlfd_idx = font_sort_order[i]; 6614 6615 if (xlfd_idx == XLFD_SWIDTH) 6616 specified[i] = face_numeric_swidth (attrs[LFACE_SWIDTH_INDEX]); 6617 else if (xlfd_idx == XLFD_POINT_SIZE) 6618 specified[i] = pt = XFASTINT (attrs[LFACE_HEIGHT_INDEX]); 6619 else if (xlfd_idx == XLFD_WEIGHT) 6620 specified[i] = face_numeric_weight (attrs[LFACE_WEIGHT_INDEX]); 6621 else if (xlfd_idx == XLFD_SLANT) 6622 specified[i] = face_numeric_slant (attrs[LFACE_SLANT_INDEX]); 6623 else 6624 abort (); 6625 } 6626 6627 avgwidth = (UNSPECIFIEDP (attrs[LFACE_AVGWIDTH_INDEX]) 6628 ? 0 6629 : XFASTINT (attrs[LFACE_AVGWIDTH_INDEX]) * width_ratio); 6630 6631 exact_p = 0; 6632 6633 if (needs_overstrike) 6634 *needs_overstrike = 0; 6635 6636 best = NULL; 6637 6638 /* Find the best match among the non-scalable fonts. */ 6639 for (i = 1; i < nfonts; ++i) 6640 if (!font_scalable_p (fonts + i) 6641 && better_font_p (specified, fonts + i, best, 1, avgwidth)) 6642 { 6643 best = fonts + i; 6644 6645 exact_p = exact_face_match_p (specified, best, avgwidth); 6646 if (exact_p) 6647 break; 6648 } 6649 6650 /* Unless we found an exact match among non-scalable fonts, see if 6651 we can find a better match among scalable fonts. */ 6652 if (!exact_p) 6653 { 6654 /* A scalable font is better if 6655 6656 1. its weight, slant, swidth attributes are better, or. 6657 6658 2. the best non-scalable font doesn't have the required 6659 point size, and the scalable fonts weight, slant, swidth 6660 isn't worse. */ 6661 6662 int non_scalable_has_exact_height_p; 6663 Event var_compare_op: Added "best" due to comparison "best != 0" Also see events: [var_deref_op] At conditional (1): "best != 0" taking false path 6664 if (best && best->numeric[XLFD_POINT_SIZE] == pt) 6665 non_scalable_has_exact_height_p = 1; 6666 else 6667 non_scalable_has_exact_height_p = 0; 6668 At conditional (2): "i < nfonts" taking true path At conditional (4): "i < nfonts" taking false path 6669 for (i = 0; i < nfonts; ++i) At conditional (3): "font_scalable_p != 0" taking false path 6670 if (font_scalable_p (fonts + i)) 6671 { 6672 if (better_font_p (specified, fonts + i, best, 0, 0) 6673 || (!non_scalable_has_exact_height_p 6674 && !better_font_p (specified, best, fonts + i, 0, 0))) 6675 { 6676 non_scalable_has_exact_height_p = 1; 6677 best = fonts + i; 6678 } 6679 } 6680 At conditional (5): "needs_overstrike != 0" taking true path 6681 if (needs_overstrike) 6682 { 6683 enum xlfd_weight want_weight = specified[XLFD_WEIGHT]; Event var_deref_op: Variable "best" tracked as NULL was dereferenced. Also see events: [var_compare_op] 6684 enum xlfd_weight got_weight = best->numeric[XLFD_WEIGHT]; 6685 6686 if (want_weight > XLFD_WEIGHT_MEDIUM && want_weight > got_weight) 6687 { 6688 /* We want a bold font, but didn't get one; try to use 6689 overstriking instead to simulate bold-face. However, 6690 don't overstrike an already-bold fontn unless the 6691 desired weight grossly exceeds the available weight. */ 6692 if (got_weight > XLFD_WEIGHT_MEDIUM) 6693 *needs_overstrike = (got_weight - want_weight) > 2; 6694 else 6695 *needs_overstrike = 1; 6696 } 6697 } 6698 } 6699 6700 /* We should have found SOME font. */ 6701 if (best == NULL) 6702 abort (); 6703 6704 if (font_scalable_p (best)) 6705 font_name = build_scalable_font_name (f, best, pt); 6706 else 6707 font_name = build_font_name (best); 6708 6709 /* Free font_name structures. */ 6710 free_font_names (fonts, nfonts); 6711 6712 return font_name; 6713 } 6714