From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3316 invoked by alias); 12 Jan 2015 14:11:23 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 3256 invoked by uid 48); 12 Jan 2015 14:11:15 -0000 From: "rguenth at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/64535] Emergency buffer for exception allocation too small Date: Mon, 12 Jan 2015 14:11:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: libstdc++ X-Bugzilla-Version: 5.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: rguenth at gcc dot gnu.org X-Bugzilla-Status: ASSIGNED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: rguenth at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-01/txt/msg00803.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64535 --- Comment #11 from Richard Biener --- (In reply to Richard Biener from comment #4) > Is the following required to work? > > #include > #include > #include > > struct large > { > char s[1024*1024*1024]; > }; > > int main() > { > rlimit lim; > lim.rlim_cur = 1024*1024*1024; > lim.rlim_max = 1024*1024*1024; > setrlimit (RLIMIT_AS, &lim); > try { > throw large (); > } catch (large&) { > } catch (std::bad_alloc) { > } > } > > I get > > > ./a.out > terminate called without an active exception > Aborted If reading 15.1.4 (Exception Handling / Throwing an exception) correctly then allocation happens in an unspecified way but according to 3.7.3.1 which specifies that if "the allocation function" that fails to allocate storage shall throw std::bad_alloc (if not marked with throw ()). But it isn't specified if the "unspecified" EH allocation "function" is marked with throw (). In particular 15.5.1 (The std::terminate function) doesn't list OOM in allocating an exception as cause of abandoning exception handling. It would be nice to get clarification from the standards body on what shall happen if EH allocation runs into OOM situations.