禁用 `tempnam' 的任何方法都是危险的,最好使用 `mkstemp'。这会引发gcc警告吗?

20

我只使用tempnam()函数来获取目录名称,所以这个安全警告并不适用于我的情况。我该如何禁用它?我找不到任何开关来实现。

6个回答

6

如果你只需要目录名称,可以使用在<stdio.h>中定义的字符串常量宏P_tmpdir


1

0
作为链接器警告,可以使用此答案的ASM解决方法/黑客来混淆: https://dev59.com/3nA75IYBdhLWcg3wOWRd#29205123 类似以下内容(快速且不太规范):
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

char my_file[20];

#define __hide_section_warning(section_string)    \
    __asm__ (".section " section_string "\n.string \"\rquidquid agis prudenter agas et respice finem \"\n\t.previous");

/* If you want to hide the linker's output */
#define hide_warning(symbol) \
    __hide_section_warning (".gnu.warning." #symbol)

hide_warning(tmpnam)

tmpnam( my_file );

lock_fd = open( my_file, O_CREAT | O_WRONLY, (S_IRUSR | S_IWUSR | S_IRGRP) );

然而,它仍将在Make.p文件中留下痕迹,因此并不完全干净,除了已经是一个hack。

附注:它在我的机器上运行 ¯\_(ツ)_/¯


0
如果您想为进程创建一个唯一的临时目录,可以使用mkdtemp
例如,这可以用于在其中创建FIFO,或者当程序需要创建大量临时文件或目录树时:然后它们可以放入该目录中。

0

"tempnam()函数返回一个指向字符串的指针,该字符串是有效的文件名,并且在tempnam()检查时不存在此名称的文件。"

警告是由于检查和稍后创建文件之间的竞争条件而引起的。

您只想获取目录名称?那有什么用呢?

就像陌生人已经说过的那样,您可以使用-Wno-deprecated-declarations禁用此类警告。


我需要在临时目录中创建一个FIFO文件,因此我使用dirname(tempnam...)。 - jackhab

-5

您可以使用GCC的-Wno-deprecated-declarations选项来禁用所有此类警告。虽然我建议您妥善处理警告,并采纳编译器的建议。


4
对我来说,这种警告并没有被消除。 - Jack
1
对我来说它也没有静音,甚至不带-w。 - FabioCosta
8
这是一个在链接阶段产生的警告,而不是编译阶段,因此这个警告没有影响。(将其放到链接阶段也无效)。(至少在g++ 4.8.2中是这样的)。 - Darren Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接