https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113596
Bug ID: 113596
Summary: Stack memory leakage caused by inline alloca
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: sanpeqf at gmail dot com
Target Milestone: ---
I discovered this issue while using inline alloca. I have tried changing to a
different version of gcc and found that this issue was introduced in gcc 8.0. I
have also tried changing to different architectures (on aarch64 and x86) and
can reproduce this issue.
The following is the code that triggers the error:
#include <string.h>
static inline __attribute__((always_inline))
int test_alloca(void)
{
void *block;
block = __builtin_alloca(0x100);
memset(block, 0, 0x100);
(void)block;
return 0;
}
int main(int argc, const char *argv[])
{
for (;;)
test_alloca();
return 0;
}
The following tests were conducted on this machine:
# gcc issue.c
# ./a.out
Segmentation fault (core dumped)
# gcc -fsanitize=address issue.c
# ./a.out
AddressSanitizer:DEADLYSIGNAL
=================================================================
==1108774==ERROR: AddressSanitizer: stack-overflow on address 0x7ffe6b152f78
(pc 0x7fd7bfa5a8ab bp 0x7ffe6b1537d0 sp 0x7ffe6b152f80 T0)
#0 0x7fd7bfa5a8ab in memset (/lib64/libasan.so.8+0x5a8ab) (BuildId:
7fcb7759bc17ef47f9682414b6d99732d6a6ab0c)
#1 0x4011c8 in main (/disk/files/workspace/gcc-issue/a.out+0x4011c8)
(BuildId: 66d839c602ac12950f3212be978c5c471e7c06e3)
#2 0x7fd7bf846149 in __libc_start_call_main (/lib64/libc.so.6+0x28149)
(BuildId: 788cdd41a15985bf8e0a48d213a46e07d58822df)
#3 0x7fd7bf84620a in __libc_start_main_impl (/lib64/libc.so.6+0x2820a)
(BuildId: 788cdd41a15985bf8e0a48d213a46e07d58822df)
#4 0x401094 in _start (/disk/files/workspace/gcc-issue/a.out+0x401094)
(BuildId: 66d839c602ac12950f3212be978c5c471e7c06e3)
SUMMARY: AddressSanitizer: stack-overflow (/lib64/libasan.so.8+0x5a8ab)
(BuildId: 7fcb7759bc17ef47f9682414b6d99732d6a6ab0c) in memset
==1108774==ABORTING
# gcc -v
...
gcc version 13.2.1 20231205 (Red Hat 13.2.1-6) (GCC)
# objdump -d ./a.out
...
0000000000401126 <main>:
main():
401126: 55 push %rbp
401127: 48 89 e5 mov %rsp,%rbp
40112a: 48 83 ec 20 sub $0x20,%rsp
40112e: 89 7d ec mov %edi,-0x14(%rbp)
401131: 48 89 75 e0 mov %rsi,-0x20(%rbp)
401135: b8 10 00 00 00 mov $0x10,%eax
40113a: 48 83 e8 01 sub $0x1,%rax
40113e: 48 05 08 01 00 00 add $0x108,%rax
401144: b9 10 00 00 00 mov $0x10,%ecx
401149: ba 00 00 00 00 mov $0x0,%edx
40114e: 48 f7 f1 div %rcx
401151: 48 6b c0 10 imul $0x10,%rax,%rax
401155: 48 29 c4 sub %rax,%rsp
401158: 48 89 e0 mov %rsp,%rax
40115b: 48 83 c0 0f add $0xf,%rax
40115f: 48 c1 e8 04 shr $0x4,%rax
401163: 48 c1 e0 04 shl $0x4,%rax
401167: 48 89 45 f8 mov %rax,-0x8(%rbp)
40116b: 48 8b 45 f8 mov -0x8(%rbp),%rax
40116f: ba 00 01 00 00 mov $0x100,%edx
401174: be 00 00 00 00 mov $0x0,%esi
401179: 48 89 c7 mov %rax,%rdi
40117c: e8 af fe ff ff call 401030 <memset@plt>
401181: 90 nop
401182: eb b1 jmp 401135 <main+0xf>