C 函数中的字符和函数外的字符有什么区别?

C 函数中的字符和函数外的字符有什么区别?,c,buffer-overflow,C,Buffer Overflow,我有两个示例代码,一个是安全的,即使使用 gcc-fno堆栈保护器-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"); }

我有两个示例代码,一个是安全的,即使使用
gcc-fno堆栈保护器-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");

}

#包括
字符检查[16];
int main(int argc,字符**argv){
printf(“输入字符串:”);
获取(检查);
printf(“%s\n”,勾选);
printf(“已接受。\n”);
}
不安全(易受攻击)程序代码:

#包括
int main(int argc,字符**argv){
字符检查[16];
printf(“输入字符串:”);
获取(检查);
printf(“%s\n”,勾选);
printf(“已接受。\n”);
}

为什么程序外的字符是“安全的”?(在我的例子中)

在第一个例子中,您声明了一个全局变量。这通常是一个坏习惯,原因很多,其中很多你会发现随着时间的推移,所以最好不要这样做,除非你没有其他选择

第二种情况使其成为本地的
main()

更好的方法是创建一个执行get assign操作并返回
char*
的函数

值得注意的是,在这两种情况下,此程序的任何内容都不安全,因为您使用的缓冲区非常小(16字节!),并且从不使用缓冲区长度受限的函数<代码>获取是最糟糕的使用方法之一。考虑其他的东西,其他的,甚至<代码> SCANF('%15s’,和Chug)< /C>
将缓冲区从一个位置移动到另一个位置并不会使其更安全。问题在于缓冲区及其使用方式。

两个程序都不安全,因为
get
是一个不安全的函数。请努力修复拼写错误。你写了好几次“保存”而不是“安全”。这使得它很难阅读。@MicheleDorigatti他们不是以英语为母语的人,让他们休息一下。
get
是一个已从C规范中删除的函数。@BitFriends未定义的行为并不总是会导致错误。您正在回答标题中的问题,不是文本中的问题。@Barmar显然,这个问题就像一个有层次的洋葱。@Barmar:“问题主体”或简单的“主体”在本例中比“文本”更具描述性。