X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL,BAYES_00,SPF_NEUTRAL X-Spam-Check-By: sourceware.org Message-ID: <4EE2483C.3080809@cs.utoronto.ca> Date: Fri, 09 Dec 2011 12:41:16 -0500 From: Ryan Johnson User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20111105 Thunderbird/8.0 MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Re: gcc-4.5.3 segfaults wrt alloca References: <20111209105801 DOT GA10388 AT po8371> <4EE22156 DOT 4080402 AT cs DOT utoronto DOT ca> <4EE24037 DOT 1000105 AT redhat DOT com> In-Reply-To: <4EE24037.1000105@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On 09/12/2011 12:07 PM, Eric Blake wrote: > On 12/09/2011 07:55 AM, Ryan Johnson wrote: >> On 09/12/2011 5:58 AM, Denis Excoffier wrote: >>> I use the latest packages and cygwin snapshots. The problem described >>> below began several snapshots in the past, around beginning of December. >>> >>> The following program, with static allocation of a reasonable amount >>> of data, segfaults, maybe in alloca(). With a smaller size >>> (eg 10000) it's ok. With new/malloc (even with 100 times more) it's >>> ok. With C or C++. 100% reproducible. >>> unsigned int const SIZE = 689471; >>> int foo[SIZE]; >> Reasonable? You're trying to stack-allocate 2.5MB of data. Don't do that >> -- stack sizes are 2MB or less in most operating systems. Besides, doing >> anything useful with a buffer that size would completely drown out the >> overhead of calling malloc. > Not only that, but stack allocating more than 64k in a single function > is a recipe for bypassing the guard page and causing windows to silently > quit your program, rather than letting cygwin catch the guard page > access and convert it to normal SIGSEGV handling. To be portable to all > OS, you should never stack allocate more than 4k in a single function. It's kind of interesting: when I ran that test case with my home-brew gcc-4.6, its alloca() explicitly walks through the proposed allocation in 4kB increments to ensure that a stack overflow triggers SIGSEGV right away, rather than allow silent data corruption later. I don't know if older versions also do this, but maybe that's why it used to "work" and now "doesn't work." Ryan -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple