stack smashing detected

这个代码会造成栈溢出

#include <stdio.h>
#include <stdbool.h>

void set_val(int *val)
{
        *val = 1;
}

int main()
{
    bool i = 0;
    
    set_val(&i);
    return 0;
}

当编译代码的时候打开了栈保护的时候,-fstack-protector-strong 或者 -fstack-protector-all,编译器会在栈上放置一个随机数,当函数返回的时候会检查这个随机数是否被修改,如果被修改了,就会报错。

Dump of assembler code for function main:
   0x0000555555555162 <+0>:     endbr64
   0x0000555555555166 <+4>:     push   %rbp
   0x0000555555555167 <+5>:     mov    %rsp,%rbp
   0x000055555555516a <+8>:     sub    $0x10,%rsp
   0x000055555555516e <+12>:    mov    %fs:0x28,%rax
   0x0000555555555177 <+21>:    mov    %rax,-0x8(%rbp)
   0x000055555555517b <+25>:    xor    %eax,%eax
   0x000055555555517d <+27>:    movb   $0x0,-0x9(%rbp)
   0x0000555555555181 <+31>:    lea    -0x9(%rbp),%rax
   0x0000555555555185 <+35>:    mov    %rax,%rdi
   0x0000555555555188 <+38>:    call   0x555555555149 <set_val>
   0x000055555555518d <+43>:    mov    $0x0,%eax
   0x0000555555555192 <+48>:    mov    -0x8(%rbp),%rdx
   0x0000555555555196 <+52>:    sub    %fs:0x28,%rdx
   0x000055555555519f <+61>:    je     0x5555555551a6 <main+68>
   0x00005555555551a1 <+63>:    call   0x555555555050 <__stack_chk_fail@plt>
=> 0x00005555555551a6 <+68>:    leave
   0x00005555555551a7 <+69>:    ret