【问题标题】:Could using gets() on an empty char array cause memory problems?在空字符数组上使用gets() 会导致内存问题吗?
【发布时间】:2021-04-26 23:27:18
【问题描述】:

下面的代码有效,但我将一个空字符串分配给一个 char 数组。

#include <stdio.h>

int main() {
  char a[ ]= "";
  gets(a);
  printf("You entered: %s", a);
  return 0;
}

然后gets(a),用用户输入的任何内容填充它,不管字符串有多长,但如果没有给出大小。我是否有覆盖内存中内容的风险?当谈到 C 时,我是一个新手,我担心我正在用这段代码做一些无懈可击的事情,因为 gets() 函数的所有文档都使用具有预定义长度的字符串,例如 char a[10 ]。

【问题讨论】:

  • 您不能将gets() 放入零长度缓冲区。也不要使用gets()。至少使用fgets()
  • 值得注意的是,您在此处使用的 gets 的特殊风格被认为足够危险,已从 C11 中的 C 和 C++ 中的 C++ 中删除 14.
  • 你不能拥有一个长度为零的数组,至少在不使用语言扩展的情况下是这样。您的示例没有这样做,并且它不包含零长度数组(如声明的那样,数组 a 的长度为 1,根据需要容纳“空”字符串的终止符)。
  • char a[] = "" 确实有预定义的长度,该长度是 1

标签: c clang


【解决方案1】:

在空字符数组上使用gets()会导致内存问题吗?

是的,绝对是。

还要回答几个额外的问题:

any 字符数组上使用 gets() 会导致内存问题吗?

是的,绝对是。

使用gets()会导致内存问题吗?

是的,绝对是。

可以使用gets

啊!停在那里。

切勿使用gets()。没有办法使用gets() 而不在程序中引入潜在的内存问题。它在设计上是不安全的。

【讨论】:

  • Re “没有办法使用gets() 而不在程序中引入内存问题”:这不是真的。 gets 可以与受信任的合作伙伴一起使用,例如来自同一用户控制的合作进程的管道。并非每个程序都位于安全边界上。以此类推,使用外部数据库(如用户和密码信息)执行身份验证的程序必须依赖程序外部的数据才能正确。这不是设计缺陷。它只是意味着安全边界必须包含必要的组件。
  • @EricPostpischil 是的,我将在那里投入一个“潜力”。这是一个参数的滑坡,如果 OP 用 [security] 或相关标签标记它,我会对此进行扩展。
【解决方案2】:

gets 是获取输入的不安全函数。

您在此处描述的漏洞称为Buffer Overflow 漏洞,可能会被具有恶意意图的攻击者用来执行任意代码。

【讨论】:

    【解决方案3】:

    我们都在某个时候学习。通常,由于这个确切原因,不使用gets()。我们倾向于使用 fgets(),您可以定义函数从输入中接收多少,以避免任何内存问题(假设您不接受太多)。

    这里是一些示例代码的链接。 https://www.geeksforgeeks.org/gets-is-risky-to-use/

    【讨论】:

    • 感谢您的链接,这对我的项目帮助很大。知道如何避免缓冲区溢出,我可以继续前进。
    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 2012-07-20
    • 1970-01-01
    • 2016-06-17
    • 2015-04-14
    • 2015-07-21
    • 2013-09-22
    • 2021-04-24
    相关资源
    最近更新 更多