抑制警告:使用`mktemp'很危险

问题描述 投票:8回答:5

如何从gcc链接器中抑制以下警告:

警告:使用'mktemp'很危险,更好用'mkstemp'

我知道使用mkstemp()更好,但出于某种原因我必须使用mktemp()功能。

c security gcc gcc-warning mktemp
5个回答
8
投票

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


4
投票

如果你必须使用mktemp,那么除了从libc.so.6删除使用mktemp的部分之外,没有任何东西可以用来抑制该警告。

为什么你要使用mktemp


4
投票

两件事情:

  • mktemp不是标准功能
  • 警告是一个特殊的警告,在链接器中实现为.gnu.warning.mktemp部分

如果确实需要写入磁盘,请使用本机OS API。或者mkstemp()建议。


1
投票

如果要静态链接运行时,则另一个选项是在对象文件中编写自己的mktemp版本。链接器应该优先于运行时版本的版本。

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

唯一的困难是清理mkstemp将返回给你的文件描述符并使一切线程安全。如果可以限制所需的临时文件数量,则可以使用静态数组描述符和atexit注册函数进行清理。如果没有,只需使用链接列表。


0
投票

使用mkstemp

int fd = mkstemp(template);

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

© www.soinside.com 2019 - 2024. All rights reserved.