char在函数内和函数外有什么区别?

What is the difference between char in a function and outside a function?

我有 2 个示例代码,其中一个可以安全防止缓冲区溢出,即使使用 gcc -fno-stack-protector -fno-pie -m32 save.c -o save

安全程序代码:

#include <stdio.h>

char check[16];

int main(int argc, char **argv) {
    printf("Enter a string: ");
    gets(check);
    printf("%s\n", check);
    printf("Accepted.\n");

}

不安全(易受攻击)程序代码:

#include <stdio.h>

int main(int argc, char **argv) {
    char check[16];
    printf("Enter a string: ");
    gets(check);
    printf("%s\n", check);
    printf("Accepted.\n");

}

为什么char在程序外"safe"? (以我为例)

在第一种情况下,您要声明一个全局变量。由于多种原因,这通常是一个坏习惯,随着时间的推移,您会发​​现其中的许多原因,因此最好永远不要这样做,除非您别无选择。

第二种情况使其在 main() 本地。

更好的方法是制作一个执行get-assign操作和returns char*.

的函数

值得注意的是,在这两种情况下,此程序没有任何安全之处,因为您使用的是可笑的小缓冲区(16 字节!)并且永远不要使用缓冲功能长度有限。 gets 是最糟糕的使用之一。考虑别的事情,任何事情,甚至 scanf('%15s', &check).

将缓冲区从一个位置移动到另一个位置并不会使其更安全。问题在于缓冲区及其使用方式。