$ cd ../
$ cat /backups/brain/
0046alloca vs VLA in C1
2
3
4
5
6
#include <alloca.h>
int square(int num) {
char b1[num];
char *b2 = (char *)alloca(num * sizeof(char));
}
Gets compiled to
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
square(int):
push rbp
mov rbp, rsp
sub rsp, 48
mov DWORD PTR [rbp-36], edi
// VLA
mov eax, DWORD PTR [rbp-36]
movsx rdx, eax
sub rdx, 1
mov QWORD PTR [rbp-8], rdx
cdqe
mov edx, 16
sub rdx, 1
add rax, rdx
mov ecx, 16
mov edx, 0
div rcx
imul rax, rax, 16
sub rsp, rax
mov rax, rsp
mov QWORD PTR [rbp-16], rax
// Alloca
mov eax, DWORD PTR [rbp-36]
cdqe
lea rdx, [rax+8]
mov eax, 16
sub rax, 1
add rax, rdx
mov esi, 16
mov edx, 0
div rsi
imul rax, rax, 16
sub rsp, rax
mov rax, rsp
add rax, 15
shr rax, 4
sal rax, 4
mov QWORD PTR [rbp-24], rax
ud2
GCC 15.2 x86-64 with -O0
$ cd ../