Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Suppress warning: the use of `mktemp' is dangerous

How can I suppress following warning from gcc linker:

warning: the use of 'mktemp' is dangerous, better use 'mkstemp'

I do know that it's better to use mkstemp() but for some reason I have to use mktemp() function.

like image 922
Konstantin Avatar asked Apr 12 '09 17:04

Konstantin


4 Answers

I guess you need the path because you pass it to a library that only accepts path names as argument and not file descriptors or FILE pointers. If so you can create a temp dir with mkdtemp and place your file there, the actual name is then unimportant because the path is already unique because of the directory.

like image 122
quinmars Avatar answered Nov 02 '22 23:11

quinmars


If you are statically linking the runtime, then the other option is to write your own version of mktemp in an object file. The linker should prefer your version over the runtime version.

Edit: Thanks to Jason Coco for pointing out a major misunderstanding that I had in mktemp and its relatives. This one is a little easier to solve now. Since the linker will prefer a version in an object file, you just need to write mktemp in terms of mkstemp.

The only difficulties are cleaning up the file descriptors that mkstemp will return to you and making everything thread safe. You could use a static array of descriptors and an atexit-registered function for cleanup if you can put a cap on how many temporary files you need. If not, just use a linked list instead.

like image 45
D.Shawley Avatar answered Nov 02 '22 23:11

D.Shawley


If you have to use mktemp then there is not anything you can do to suppress that warning short of removing the section that uses mktemp from libc.so.6.

Why do you have to use mktemp?

like image 4
Nick Presta Avatar answered Nov 02 '22 22:11

Nick Presta


Two things:

  • mktemp is not a standard function
  • the warning is a special one implemented in the linker as .gnu.warning.mktemp section

Use a native OS API if you really need to write to the disk. Or mkstemp() as suggested.

like image 4
dirkgently Avatar answered Nov 02 '22 23:11

dirkgently