https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88576
Bug ID: 88576 Summary: -fno-math-errno causes GCC to consider that malloc does not set errno Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: aurelien at aurel32 dot net Target Milestone: --- With the -fno-math-errno option, GCC optimizes-out saving and restoring errno around a malloc call. Here is a testcase, derived from the GNU libc string/strerror.c, to reproduce it: typedef long unsigned int size_t; extern char *__strerror_r (int __errnum, char *__buf, size_t __buflen); extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec"))); static char *buf; char *strerror (int errnum) { int saved_errno; saved_errno = __libc_errno; buf = malloc (1024); (__libc_errno = (saved_errno)); return __strerror_r (errnum, buf, 1024); } Compile with: gcc -fmath-errno -Wall -O2 -fPIC -S -c strerror.i Without -fno-math-errno, we can see in the output assembly code that errno is saved around the malloc call: strerror: .LFB0: .cfi_startproc pushq %r12 .cfi_def_cfa_offset 16 .cfi_offset 12, -16 pushq %rbp .cfi_def_cfa_offset 24 .cfi_offset 6, -24 movl %edi, %ebp movl $1024, %edi pushq %rbx .cfi_def_cfa_offset 32 .cfi_offset 3, -32 movq __libc_errno@gottpoff(%rip), %rbx movl %fs:(%rbx), %r12d call malloc@PLT movl %ebp, %edi movl $1024, %edx movl %r12d, %fs:(%rbx) movq %rax, %rsi popq %rbx .cfi_def_cfa_offset 24 popq %rbp .cfi_def_cfa_offset 16 popq %r12 .cfi_def_cfa_offset 8 jmp __strerror_r@PLT .cfi_endproc With -fno-math-errno, saving and restoring errno is optimized out: strerror: .LFB0: .cfi_startproc pushq %rbx .cfi_def_cfa_offset 16 .cfi_offset 3, -16 movl %edi, %ebx movl $1024, %edi call malloc@PLT movl %ebx, %edi movl $1024, %edx popq %rbx .cfi_def_cfa_offset 8 movq %rax, %rsi jmp __strerror_r@PLT .cfi_endproc This is reproducible with 6.5, 7.4, 8.2 and a snapshot of trunk from 2018-12-17.