From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Wolfgang Jenkner Newsgroups: gmane.emacs.bugs Subject: bug#22085: 25.0.50; src/gmalloc.c hit by gcc >= 5 optimization Date: Thu, 03 Dec 2015 18:53:25 +0100 Message-ID: <854mfzzaei.fsf@iznogoud.viz> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1449165325 30280 80.91.229.3 (3 Dec 2015 17:55:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 3 Dec 2015 17:55:25 +0000 (UTC) Cc: John Marino To: 22085@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Dec 03 18:55:12 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1a4Y63-0002rc-Oo for geb-bug-gnu-emacs@m.gmane.org; Thu, 03 Dec 2015 18:55:12 +0100 Original-Received: from localhost ([::1]:36744 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y63-0001jj-42 for geb-bug-gnu-emacs@m.gmane.org; Thu, 03 Dec 2015 12:55:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y5y-0001iF-N9 for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:55:07 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4Y5u-0006Qe-Fu for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:55:06 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:48023) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y5u-0006Qa-Cy for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:55:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1a4Y5u-0001kb-8d; Thu, 03 Dec 2015 12:55:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Wolfgang Jenkner Original-Sender: "Debbugs-submit" Resent-CC: marino@FreeBSD.org, bug-gnu-emacs@gnu.org Resent-Date: Thu, 03 Dec 2015 17:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 22085 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: John Marino Original-Received: via spool by submit@debbugs.gnu.org id=B.14491652466656 (code B ref -1); Thu, 03 Dec 2015 17:55:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 3 Dec 2015 17:54:06 +0000 Original-Received: from localhost ([127.0.0.1]:37730 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a4Y4z-0001jI-DV for submit@debbugs.gnu.org; Thu, 03 Dec 2015 12:54:05 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:58726) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a4Y4f-0001ic-Rr for submit@debbugs.gnu.org; Thu, 03 Dec 2015 12:54:04 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4Y4b-0005lJ-Af for submit@debbugs.gnu.org; Thu, 03 Dec 2015 12:53:45 -0500 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:35390) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y4b-0005lA-7D for submit@debbugs.gnu.org; Thu, 03 Dec 2015 12:53:41 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:40394) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y4V-00011d-Ap for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:53:41 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4Y4R-0005fN-4S for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:53:35 -0500 Original-Received: from b2bfep12.mx.upcmail.net ([62.179.121.57]:51490) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4Y4Q-0005cB-QS for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 12:53:31 -0500 Original-Received: from edge12.upcmail.net ([192.168.13.82]) by b2bfep12.mx.upcmail.net (InterMail vM.8.01.05.18 201-2260-151-151-20140610) with ESMTP id <20151203175326.LDYS16586.b2bfep12-int.chello.at@edge12.upcmail.net> for ; Thu, 3 Dec 2015 18:53:26 +0100 Original-Received: from iznogoud.viz ([91.119.234.240]) by edge12.upcmail.net with edge id p5tS1r0035BsVPf0C5tSAE; Thu, 03 Dec 2015 18:53:26 +0100 X-SourceIP: 91.119.234.240 Original-Received: from wolfgang by iznogoud.viz with local (Exim 4.86 (FreeBSD)) (envelope-from ) id 1a4Y4L-0000Uo-Pb for bug-gnu-emacs@gnu.org; Thu, 03 Dec 2015 18:53:25 +0100 User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.1.50 (berkeley-unix) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:109563 Archived-At: --=-=-= Content-Type: text/plain On systems which use src/gmalloc.c but don't define HYBRID_MALLOC that file defines global replacements for malloc and other memory management functions. Strictly speaking, this results in undefined behaviour according to ISO C11 (wg14 n1570 draft) 7.1.3 and 7.22.3. But it used to work. However, with recent gcc versions and the default optimization level (-O2), most of the definition of calloc is replaced with a call to calloc (which the linker resolves to a call to that same calloc). Chances are temacs crashes because some library calls calloc. This happens with the gcc 5.2.0 release and also with the 6.0.0 20151108 snapshot. Please find below a self-contained test program which shows the problem (try gcc5 -Wall -g -O2 callocopt.c -o callocopt && ./callocopt 666, and then with -O instead of -O2, or even with -O2 -fno-optimize-strlen). For comparison purposes, I note that, meanwhile, the issue has also surfaced here http://permalink.gmane.org/gmane.os.freebsd.devel.cvs.src/210733 Back to the problem with gmalloc.c, I'd suggest the simple toolchain-independent work-around given in the patch below. A real fix is to use hybrid malloc. --=-=-= Content-Type: text/x-csrc Content-Disposition: attachment; filename=callocopt.c Content-Description: Test program #include #include #include #include #include void * calloc (size_t bytes, size_t size) { void *result; static int cnt; if (cnt++) { fprintf(stderr, "Been there, done that.\n"); abort(); } result = malloc(bytes); if (result) return memset(result, 0, bytes); return result; } int main (int argc, char *argv[]) { if (argc != 2) return (1); size_t bytes = strtoul(argv[1], NULL, 10); return (calloc(bytes, 1) ? 42 : 0); } --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-src-gmalloc.c-Always-define-gmalloc-and-friends.patch Content-Description: gcc 5 optimization work-around for gmalloc >From 91a5b2c6f46db7f6882fb1bf514209f45802732e Mon Sep 17 00:00:00 2001 From: Wolfgang Jenkner Date: Mon, 16 Nov 2015 13:15:00 +0100 Subject: [PATCH 1/5] * src/gmalloc.c: Always define gmalloc and friends. This is a work-around to prevent the compiler from using semantic knowledge about malloc for optimization purposes. E.g., newer gcc with -O2 replaces most of calloc's definition by a call to calloc. --- src/gmalloc.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/gmalloc.c b/src/gmalloc.c index a88f4ab..90a52a1 100644 --- a/src/gmalloc.c +++ b/src/gmalloc.c @@ -60,7 +60,6 @@ extern void emacs_abort (void); which HYBRID_MACRO is defined. Any other platform that wants to define it will have to define the macros DUMPED and ALLOCATED_BEFORE_DUMPING, defined below for Cygwin. */ -#ifdef HYBRID_MALLOC #undef malloc #undef realloc #undef calloc @@ -70,7 +69,6 @@ extern void emacs_abort (void); #define calloc gcalloc #define aligned_alloc galigned_alloc #define free gfree -#endif /* HYBRID_MALLOC */ #ifdef CYGWIN extern void *bss_sbrk (ptrdiff_t size); @@ -1711,13 +1709,13 @@ valloc (size_t size) return aligned_alloc (pagesize, size); } -#ifdef HYBRID_MALLOC #undef malloc #undef realloc #undef calloc #undef aligned_alloc #undef free +#ifdef HYBRID_MALLOC /* Declare system malloc and friends. */ extern void *malloc (size_t size); extern void *realloc (void *ptr, size_t size); @@ -1816,6 +1814,38 @@ hybrid_get_current_dir_name (void) } #endif +#else /* ! HYBRID_MALLOC */ + +void * +malloc (size_t size) +{ + return gmalloc (size); +} + +void * +calloc (size_t nmemb, size_t size) +{ + return gcalloc (nmemb, size); +} + +void +free (void *ptr) +{ + gfree (ptr); +} + +void * +aligned_alloc (size_t alignment, size_t size) +{ + return galigned_alloc (alignment, size); +} + +void * +realloc (void *ptr, size_t size) +{ + return grealloc (ptr, size); +} + #endif /* HYBRID_MALLOC */ #ifdef GC_MCHECK -- 2.6.3 --=-=-=--