如何从gcc链接器中抑制以下警告:
警告:使用'mktemp'是危险的,更好地使用'mkstemp'
我知道最好使用mkstemp()
,但由于某种原因,我必须使用mktemp()
函数。
答案 0 :(得分:8)
我猜你需要路径,因为你把它传递给一个只接受路径名作为参数而不是文件描述符或FILE
指针的库。如果是这样,您可以使用mkdtemp
创建临时目录并将文件放在那里,实际名称就不重要了,因为路径因目录而已经是唯一的。
答案 1 :(得分:4)
如果您 使用mktemp
,那么除了从libc.so.6删除使用mktemp
的部分之外,您无法做任何事情来抑制该警告
为什么 使用mktemp
?
答案 2 :(得分:4)
两件事:
mktemp
不是标准功能.gnu.warning.mktemp
部分如果确实需要写入磁盘,请使用本机OS API。或按照建议mkstemp()
。
答案 3 :(得分:1)
如果要静态链接运行时,则另一个选项是在对象文件中编写自己的mktemp
版本。链接器应该优先于运行时版本的版本。
编辑:感谢Jason Coco指出我在mktemp
及其亲属中遇到的一个重大误解。这个现在更容易解决。由于链接器更喜欢目标文件中的版本,因此您只需要根据mktemp
编写mkstemp
。
唯一的困难是清理mkstemp
将返回给你并使一切线程安全的文件描述符。如果可以对需要的临时文件数量设置上限,则可以使用静态数组描述符和atexit
注册函数进行清理。如果没有,只需使用链接列表。
答案 4 :(得分:0)
使用mkstemp
:
int fd = mkstemp(template);
此次通话后,template
将替换为实际的文件名。您将拥有文件描述符和文件路径。