tmpnam предупреждение высказывания его опасен

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

25
задан Lightness Races with Monica 30 January 2012 в 13:54
поделиться

5 ответов

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

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

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

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

26
ответ дан 28 November 2019 в 21:39
поделиться

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

3
ответ дан 28 November 2019 в 21:39
поделиться

, если вы говорите о предупреждении компилятора 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 )

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

1
ответ дан 28 November 2019 в 21:39
поделиться

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

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

1
ответ дан 28 November 2019 в 21:39
поделиться

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

0
ответ дан 28 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: