Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对空字符数组使用gets()是否会导致内存问题?_C_Clang - Fatal编程技术网

C 对空字符数组使用gets()是否会导致内存问题?

C 对空字符数组使用gets()是否会导致内存问题?,c,clang,C,Clang,下面的代码可以工作,但我将为char数组分配一个空字符串 #include <stdio.h> int main() { char a[ ]= ""; gets(a); printf("You entered: %s", a); return 0; } 然后getsa,用用户输入的任何内容填充它,不管字符串有多长,但是如果没有给出大小。我是否有可能覆盖内存中的内容?谈到C,我有点生疏,我担心我在用这段代码做一些不可靠的事情,

下面的代码可以工作,但我将为char数组分配一个空字符串

#include <stdio.h>

int main() {
  char a[ ]= "";
  gets(a);
  printf("You entered: %s", a);
  return 0;
}
然后getsa,用用户输入的任何内容填充它,不管字符串有多长,但是如果没有给出大小。我是否有可能覆盖内存中的内容?谈到C,我有点生疏,我担心我在用这段代码做一些不可靠的事情,因为GET函数的所有文档都使用了一个预定义长度的字符串,比如char a[10]。

GET是一个获取输入的不安全函数

您在此处描述的漏洞称为缓冲区溢出漏洞,可能被恶意攻击者用来执行任意代码

在空字符数组上使用get是否会导致内存问题

是的,非常肯定

还要回答几个其他问题:

在任何字符数组上使用GET是否会导致内存问题

是的,非常肯定

使用GET会导致内存问题吗

是的,非常肯定

可以使用gets吗

啊!!停在那里


永远不要使用它。如果不在程序中引入潜在的内存问题,就无法使用gets。设计上是不安全的。

我们都在某个时候学习过。一般来说,由于这个确切的原因,不使用GET。我们倾向于使用FGET,您可以定义函数从输入接收的量,以避免任何内存问题(假设您不接受太多)


下面是一些示例代码的链接

你不能进入一个零长度的缓冲区。也不要使用get。至少使用FFET。值得注意的是,你使用的特定的味道被认为是危险的,它被从C中移除,而在C++中从C++中被移除。您的示例没有这样做,并且它不包含声明的零长度数组,数组a的长度为1,这是容纳空字符串的终止符所需的长度。char a[]=具有预定义的长度,该长度是链接的1个字节,这对我的项目有很大帮助。我可以进一步了解如何避免缓冲区溢出。Re“如果不在程序中引入内存问题,就无法使用gets”:这是不正确的。gets可以与受信任的伙伴一起使用,例如来自由同一用户控制的协作进程的管道。并不是每个程序都在安全边界上。类似地,使用外部数据库(如用户和密码信息)执行身份验证的程序必须依赖于程序外部的数据才能正确。这不是一个设计缺陷;这仅仅意味着安全周界必须包含必要的组件。@EricPostchil是的,我将在其中加入一个电势。这是一个论证的滑坡,如果OP用[security]或相关的标签将其标记,我会对此进行扩展。