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