【问题标题】:Suppress warning: the use of `mktemp' is dangerous禁止警告:使用 `mktemp' 是危险的
【发布时间】:2009-04-12 17:37:21
【问题描述】:

如何抑制来自 gcc 链接器的以下警告:

警告:使用“mktemp”很危险,最好使用“mkstemp”

我知道使用mkstemp() 会更好,但由于某种原因我必须使用mktemp() 函数。

【问题讨论】:

  • 使用 mkstemp 代替 mktemp。
  • 你必须使用mktemp的原因是什么?
  • 你在编译 bash gnu.org/software/bash时看到这个警告
  • 同时编译最近的 glibc 生成它:)。

标签: c security gcc gcc-warning mktemp


【解决方案1】:

我猜你需要路径,因为你将它传递给一个只接受路径名作为参数而不接受文件描述符或FILE 指针的库。如果是这样,您可以使用mkdtemp 创建一个临时目录并将您的文件放在那里,实际名称并不重要,因为该路径已经是唯一的,因为目录。

【讨论】:

  • 你绝对可以使用 mkstemp: int fd = mkstemp(template);在此调用之后,模板将替换为实际的文件名。您将拥有文件描述符和文件的路径。
  • @Jason Coco 您可能会考虑将其作为答案,以便对其进行投票;-)
  • @Jason Coco,嗯,好吧,这听起来很合理:)。我同意洛塔尔的说法。
【解决方案2】:

如果您必须使用 mktemp,那么除了从 libc.so.6 中删除使用 mktemp 的部分之外,您无法采取任何措施来抑制该警告。

你为什么使用mktemp

【讨论】:

    【解决方案3】:

    两件事:

    • mktemp 不是标准函数
    • 警告是在链接器中作为.gnu.warning.mktemp 部分实现的特殊警告

    如果您确实需要写入磁盘,请使用本机操作系统 API。或 mkstemp() 建议。

    【讨论】:

    • mktemp() 是(或曾经是)标准函数。例如在 POSIX.1-2001 中。但无论如何都不要使用它。
    【解决方案4】:

    如果您静态链接运行时,那么另一个选择是在目标文件中编写您自己的mktemp 版本。链接器应该更喜欢您的版本而不是运行时版本。

    编辑:感谢 Jason Coco 指出我在 mktemp 及其亲属中的一个重大误解。这个现在更容易解决。由于链接器更喜欢目标文件中的版本,因此您只需按照mkstemp 编写mktemp

    唯一的困难是清理mkstemp 将返回给您的文件描述符并确保所有内容都是线程安全的。如果您可以限制需要多少临时文件,则可以使用静态描述符数组和atexit-registered 函数进行清理。如果没有,请改用链表。

    【讨论】:

    • @D: 向 mkstemp 或 mktemp 提供常量字符串是错误的,因为库调用将尝试更改字符串,您将遇到总线故障。
    【解决方案5】:

    使用mkstemp:

    int fd = mkstemp(template);
    

    在此调用之后,template 将被替换为实际文件名。您将拥有文件描述符和文件路径。

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多