https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106288
Bug ID: 106288
Summary: stack protector fails to check stack canary for
noreturn function
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
Target Milestone: ---
[hjl@gnu-tgl-3 stack-protector]$ cat x.c
extern void foo (void) __attribute__ ((noreturn));
void
bar (void)
{
foo ();
}
[hjl@gnu-tgl-3 stack-protector]$
/export/build/gnu/tools-build/gcc-gitlab-debug/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/tools-build/gcc-gitlab-debug/build-x86_64-linux/gcc/ -O2
-Wall -fstack-protector-all -S x.c
[hjl@gnu-tgl-3 stack-protector]$ cat x.s
.file "x.c"
.text
.p2align 4
.globl bar
.type bar, @function
bar:
.LFB0:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movq %fs:40, %rax
movq %rax, 8(%rsp)
xorl %eax, %eax
call foo
.cfi_endproc
.LFE0:
.size bar, .-bar
.ident "GCC: (GNU) 13.0.0 20220713 (experimental)"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-tgl-3 stack-protector]$
There should be a stack canary check before calling foo since foo won't return.