предупреждение о том, что это опасно - PullRequest
25 голосов
/ 21 июля 2010

Я получаю это предупреждение о том, что tmpnam опасен, но я бы предпочел использовать его, поскольку он может использоваться как в Windows, так и в Linux.Мне было интересно, почему это будет считаться опасным (полагаю, что это связано с возможностью неправильного использования, а не с неправильной работой).

Ответы [ 5 ]

26 голосов
/ 21 июля 2010

Из man-страницы tmpnam:

Функция tmpnam () генерирует новую строку при каждом вызове, вплоть до времен TMP_MAX. Если он вызывается более чем в TMP_MAX раз, поведение определяется реализацией.

Хотя tmpnam () генерирует имена, которые трудно угадать, тем не менее, возможно, что между временем, когда tmpnam () возвращает имя пути, и временем, когда программа его открывает, другая программа может создать это имя, используя open (2). ) или создайте его как символическую ссылку. Это может привести к дырам в безопасности. Чтобы избежать таких возможностей, используйте флаг open (2) O_EXCL, чтобы открыть путь. Или еще лучше, используйте mkstemp (3) или tmpfile (3).

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

3 голосов
/ 21 июля 2010

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

1 голос
/ 21 июля 2010

, если вы говорите о предупреждении компилятора MSVC:

 These functions are deprecated because more secure versions are available;
 see tmpnam_s, _wtmpnam_s.

(http://msdn.microsoft.com/de-de/library/hs3e7355(VS.80).aspx)

, в противном случае просто прочитайте, что страницы руководства говорят о недостатках этой функции.2-й процесс, создающий точно такое же имя файла, что и ваш процесс.

1 голос
/ 21 июля 2010

Из справочной страницы tmpnam (3):

Хотя tmpnam () генерирует имена, которые трудно угадать, тем не менее возможно, что между временем что tmpnam () возвращает путь и время, когда программа его открывает, другая программа может создать этот путь. имя, используя open (2), или создайте его как символическую ссылку. Это может привести к дырам в безопасности. Чтобы избежать такой возможности связи, используйте флаг open (2) O_EXCL, чтобы открыть путь. Или еще лучше, используйте mkstemp (3) или tmpfile (3).

0 голосов
/ 21 июля 2010

Функция опасна, потому что вы несете ответственность за выделение буфера, который будет достаточно большим для обработки строки, которую tmpnam() собирается записать в этот буфер.Если вы выделите слишком маленький буфер, tmpnam() не сможет это узнать и переполнит буфер (вызывая хаос).tmpnam_s() (безопасная версия MS) требует, чтобы вы передавали длину буфера, поэтому tmpnam_s знает, когда остановиться.

...