From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27005 invoked by alias); 7 Jul 2006 11:08:30 -0000 Received: (qmail 26993 invoked by uid 22791); 7 Jul 2006 11:08:28 -0000 X-Spam-Check-By: sourceware.org Received: from lon-del-03.spheriq.net (HELO lon-del-03.spheriq.net) (195.46.50.99) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 07 Jul 2006 11:08:24 +0000 Received: from lon-out-01.spheriq.net ([195.46.50.129]) by lon-del-03.spheriq.net with ESMTP id k67B8LRi013597 for ; Fri, 7 Jul 2006 11:08:21 GMT Received: from lon-cus-02.spheriq.net (lon-cus-02.spheriq.net [195.46.50.38]) by lon-out-01.spheriq.net with ESMTP id k67B8LlN021720 for ; Fri, 7 Jul 2006 11:08:21 GMT Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by lon-cus-02.spheriq.net with ESMTP id k67B83QU028881 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Fri, 7 Jul 2006 11:08:10 GMT Received: from zeta.dmz-eu.st.com (ns2.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 67D60DA69 for ; Fri, 7 Jul 2006 11:07:17 +0000 (GMT) Received: from mail1.bri.st.com (mail1.bri.st.com [164.129.8.218]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 166E047446 for ; Fri, 7 Jul 2006 11:07:17 +0000 (GMT) Received: from [164.129.15.13] (bri1043.bri.st.com [164.129.15.13]) by mail1.bri.st.com (MOS 3.5.8-GR) with ESMTP id CHU43471 (AUTH stubbsa); Fri, 7 Jul 2006 12:07:16 +0100 (BST) Message-ID: <44AE4063.2080100@st.com> Date: Fri, 07 Jul 2006 11:08:00 -0000 From: Andrew STUBBS User-Agent: Thunderbird 1.5.0.4 (Windows/20060516) MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Re: [PATCH] Fix segfault on empty else References: <44980741.4040404@st.com> <20060620201752.GA1453@nevyn.them.org> <4499247B.7050404@st.com> <20060706133044.GC18827@nevyn.them.org> <44AD37E6.5050705@st.com> <20060706162349.GA24631@nevyn.them.org> In-Reply-To: <20060706162349.GA24631@nevyn.them.org> Content-Type: multipart/mixed; boundary="------------010603080703050607030200" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-07/txt/msg00053.txt.bz2 This is a multi-part message in MIME format. --------------010603080703050607030200 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 339 Daniel Jacobowitz wrote: > Does this work better? Yes much better, thanks. It now runs all the tests, no matter what, and reports crashes as failures. The only exception is the very last one, which really is unresolved following the failure of the previous test. How about the attached patch then? :ADDPATCH testsuite: Andrew Stubbs --------------010603080703050607030200 Content-Type: text/plain; name="empty-else-test.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="empty-else-test.patch" Content-length: 3652 2006-07-07 Andrew Stubbs * gdb.base/ifelse.exp: New file. Index: src/gdb/testsuite/gdb.base/ifelse.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ src/gdb/testsuite/gdb.base/ifelse.exp 2006-07-07 11:59:28.000000000 +0100 @@ -0,0 +1,105 @@ +# Copyright 2006 Free Software Foundation, Inc. + +# This program 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 of the License, or +# (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# This test checks that the if .. else .. end construct works and may +# contain empty bodies without crashing. + +if $tracelevel then { + strace $tracelevel +} + +gdb_exit +gdb_start + +# First test that the if command works with an empty body +# Test with different conditions because the body is ignored +# if it is not executed. + +# with true condition +set message "if 1 with empty body" +gdb_test_multiple "if 1\nend\necho got here\\n" $message { + -re ".*got here.*$gdb_prompt $" {pass $message} + eof { + fail "$message (crashed)" + gdb_exit + gdb_start + } +} + +# with false condition +set message "if 0 with empty body" +gdb_test_multiple "if 0\nend\necho got here\\n" $message { + -re ".*got here.*$gdb_prompt $" {pass $message} + eof { + fail "$message (crashed)" + gdb_exit + gdb_start + } +} + +# Second, do the same tests with an empty else body. +# This fails in GDB <=6.5 + +# Unfortunately it was an uninitialised memory problem so +# sometimes it just works. Preceed it with an if else end with +# bodies and hopefully the memory with be dirty and the problem +# will show itself (this works at time of writing). + +gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" "" + +# with true condition +set message "if 1 .. else with empty body" +gdb_test_multiple "if 1\nelse\nend\necho got here\\n" $message { + -re ".*got here.*$gdb_prompt $" {pass $message} + eof { + fail "$message (crashed)" + gdb_exit + gdb_start + } +} + +# dirty memory +gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" "" + +# with false condition +set message "if 0 .. else with empty body" +gdb_test_multiple "if 0\nelse\nend\necho got here\\n" $message { + -re ".*got here.*$gdb_prompt $" {pass $message} + eof { + fail "$message (crashed)" + gdb_exit + gdb_start + } +} + +gdb_test "set confirm off" "" "" + +# Test that a define with an empty else can be replaced. +# If there is memory corruption then free will fail. +# dirty memory +gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" "" +# create +gdb_test "define abc\nif 1\nelse\nend\nend" "" "create define with empty else" +# call (note that condition is 1 so should pass) +gdb_test "abc" "" "call original define" +# replace +set message "replace define with if .. else with empty body" +gdb_test_multiple "define abc\necho got here\\n\nend" $message { + -re "$gdb_prompt $" {pass $message} + eof {fail "$message (crashed)"} +} +# call +gdb_test "abc" "got here" "call replacement define" --------------010603080703050607030200--