Подавить предупреждение: использование `mktemp 'опасно - PullRequest
8 голосов
/ 12 апреля 2009

Как я могу отключить следующее предупреждение от компоновщика gcc:

предупреждение: использование 'mktemp' опасно, лучше использовать 'mkstemp'

Я знаю, что лучше использовать mkstemp(), но по какой-то причине я должен использовать функцию mktemp().

Ответы [ 5 ]

8 голосов
/ 13 апреля 2009

Полагаю, вам нужен путь, потому что вы передаете его в библиотеку, которая принимает в качестве аргумента только пути, а не дескрипторы файлов или FILE указатели. Если это так, вы можете создать временный каталог с помощью mkdtemp и поместить туда свой файл, тогда фактическое имя не имеет значения, поскольку путь уже уникален из-за каталога.

4 голосов
/ 12 апреля 2009

Две вещи:

  • mktemp не является стандартной функцией
  • предупреждение является специальным, реализованным в компоновщике как .gnu.warning.mktemp section

Используйте нативный API ОС, если вам действительно нужно записать на диск. Или mkstemp() как предложено.

4 голосов
/ 12 апреля 2009

Если у вас есть для использования mktemp, то вы ничего не можете сделать, чтобы подавить это предупреждение, кроме удаления раздела, использующего mktemp из libc.so.6.

Почему у вас есть для использования mktemp?

1 голос
/ 12 апреля 2009

Если вы статически связываете среду выполнения, тогда другой вариант - записать собственную версию mktemp в объектный файл. Компоновщик должен предпочесть вашу версию рабочей версии.

Редактировать : Спасибо Джейсону Коко за то, что он указал на серьезное недоразумение, которое у меня было в mktemp и его родственниках. Это немного легче решить сейчас. Поскольку компоновщик предпочитает версию в объектном файле, вам просто нужно написать mktemp в терминах mkstemp.

Единственными сложностями являются очистка файловых дескрипторов, которые mkstemp вернет вам, и обеспечение безопасности всего потока. Вы можете использовать статический массив дескрипторов и atexit -регистрационную функцию для очистки, если вы можете ограничить количество временных файлов, которые вам нужны. Если нет, просто используйте связанный список.

0 голосов
/ 14 августа 2017

Использование mkstemp:

int fd = mkstemp(template);

После этого вызова template будет заменено фактическим именем файла. У вас будет дескриптор файла и путь к файлу.

...