2016-02-03 19 views
0

(注:這是不是一個重複問題)警告:使用的tempnam'「是很危險的,更好地利用'mkstemp」

我使用的libc函數tempnam,並獲得以下警告:

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

我的問題不是「如何禁用警告」,而是「我應該使用什麼函數」? mkstemp沒有幫助,因爲我沒有嘗試創建一個臨時文件 - 我正在創建一個臨時目錄。而AFAIK,這沒有一個API函數。

所以,如果我不應該使用tempnam,我應該使用什麼上午

回答

2

您正在尋找mkdtemp

mkdtemp - create a unique temporary directory 

例如,

#include <stdlib.h> 
#include <string.h> 
... 
char templatebuf[80]; 
char *mkdirectory = mkdtemp(strcpy(templatebuf, "/tmp/mkprogXXXXXX")); 

使用strcpy,以確保傳遞給mkdtemp參數是可寫的(C89),或

#include <stdlib.h> 
... 
char templatebuf[] = "/tmp/mkprogXXXXXX"; 
char *mkdirectory = mkdtemp(templatebuf); 

與c99。由於該功能是「新的」(僅在過去的十年內標準化,儘管在20世紀90年代中期在Linux中提供),您需要將頭文件中的功能與預處理器定義(可能會有所不同從一個平臺到另一個平臺)。最簡單的Linux是定義_GNU_SOURCE,例如,

gcc -D_GNU_SOURCE -o foo foo.c 
+0

相反strc​​py'的',您可以用'字符templatebuf [] = 「/ tmp目錄/ mkprogXXXXXX」;' – Barmar

+0

怎麼C99允許沒有它這個常數分配不可寫入? –

+0

這是可寫內存的*初始化,而不是簡單的*賦值*。爲了驗證我對標準的理解,我使用'-Wcast-qual'和'-Wwrite-strings'檢查了gcc(至少證明了gcc同意)。 –