分配不必要的缓冲区

时间:2017-07-26 07:21:10

标签: c assembly gdb

我有一个小C程序:

#include<stdio.h>

void getInput();
void what();

int main()
{
        getInput();
}

void getInput()
{
        char buffer[6];
        gets(buffer);
        puts(buffer);
}

void what()
{
        printf("What!! No one called me!!\n");
}

当在GDB中调试时,我得到(我没有包含函数的代码what()):

0x5555555546f0 <main>           push   %rbp                                                                                                                         │
   │0x5555555546f1 <main+1>         mov    %rsp,%rbp                                                                                                                    │
   │0x5555555546f4 <main+4>         mov    $0x0,%eax                                                                                                                    │
   │0x5555555546f9 <main+9>         callq  0x555555554705 <getInput>                                                                                                    │
   │0x5555555546fe <main+14>        mov    $0x0,%eax                                                                                                                    │
   │0x555555554703 <main+19>        pop    %rbp                                                                                                                         │
   │0x555555554704 <main+20>        retq
   |0x555555554705 <getInput>       push   %rbp                                                                                                                         │
   │0x555555554706 <getInput+1>     mov    %rsp,%rbp                                                                                                                    │
   │0x555555554709 <getInput+4>     sub    $0x10,%rsp                                                                                                                  │
  >│0x55555555470d <getInput+8>     lea    -0x6(%rbp),%rax                                                                                                              │
   │0x555555554711 <getInput+12>    mov    %rax,%rdi                                                                                                                    │
   │0x555555554714 <getInput+15>    mov    $0x0,%eax                                                                                                                    │
   │0x555555554719 <getInput+20>    callq  0x5555555545a0 <gets@plt>                                                                                                    │
   │0x55555555471e <getInput+25>    lea    -0x6(%rbp),%rax                                                                                                              │
   │0x555555554722 <getInput+29>    mov    %rax,%rdi                                                                                                                    │
   │0x555555554725 <getInput+32>    callq  0x555555554590 <puts@plt>                                                                                                    │
   │0x55555555472a <getInput+37>    nop                                                                                                                                 │
   │0x55555555472b <getInput+38>    leaveq                                                                                                                              │
   │0x55555555472c <getInput+39>    retq

我相信sub $0x10,%rsp中的getInput()用于通过使堆栈指针指向远离其当前位置的16个字节来将内存分配到堆栈中。我想知道为什么编译器在堆栈上分配了16个字节的内存,而C代码只要求6个字节?我知道下一条指令lea -0x6(%rbp),%rax允许用户只使用6个字节的内存,但为什么我们只分配16个呢?

0 个答案:

没有答案