2009-04-12 12 views
6

Come posso sopprimere seguente avviso dal linker GCC:sopprimere: l'uso di `mktemp' è pericoloso

avvertimento: l'uso di 'mktemp' è pericoloso, l'uso migliore 'mkstemp'

So che è meglio usare mkstemp() ma per qualche ragione devo usare la funzione mktemp().

+0

Utilizzare mkstemp anziché mktemp. –

+3

Qual è il motivo per cui devi usare mktemp? –

risposta

8

Suppongo che sia necessario il percorso perché lo si passa a una libreria che accetta solo nomi di percorso come argomento e non descrittori di file o puntatori FILE. In tal caso, è possibile creare una directory temporanea con mkdtemp e posizionare il file lì, il nome effettivo non è importante perché il percorso è già univoco a causa della directory.

+7

Puoi assolutamente ANCORA usare mkstemp: int fd = mkstemp (template); Dopo questa chiamata, il modello verrà sostituito con il nome del file effettivo. Avrai il descrittore del file e il percorso del file. –

+0

@Jason Coco potresti prendere in considerazione la possibilità di fare una risposta, in modo che possa essere upvoted ;-) – lothar

+0

@Jason Coco, ah ok, sembra ragionevole :). Sono d'accordo con Lothar di fare una risposta fuori di esso. – quinmars

4

Se avete usare mktemp allora non c'è niente che puoi fare per sopprimere quel breve preavviso di rimuovere la sezione che utilizza mktemp da libc.so.6.

Perché il ha per utilizzare mktemp?

0

Se si collega staticamente il runtime, l'altra opzione è scrivere la propria versione di mktemp in un file oggetto. Il linker dovrebbe preferire la tua versione rispetto alla versione runtime.

Edit: Grazie a Jason Coco per indicare un grande malinteso che avevo in mktemp e dei suoi parenti. Questo è un po 'più facile da risolvere ora. Poiché il linker preferirà una versione in un file oggetto, è sufficiente scrivere mktemp in termini di mkstemp.

Le uniche difficoltà sono la pulizia dei descrittori di file che mkstemp restituirà a te e rendendo tutto thread thread. È possibile utilizzare una matrice statica di descrittori e una funzione registrata per la pulizia di atexit se si riesce a mettere un limite sul numero di file temporanei necessari. In caso contrario, basta usare invece una lista collegata.

+1

@D: È un errore fornire una stringa costante a mkstemp o mktemp perché la chiamata alla libreria tenterà di alterare la stringa e si verificherà un errore del bus. –

4

Due cose:

  • mktemp non è una funzione standard di
  • l'avvertimento è uno speciale implementato nel linker come .gnu.warning.mktemp sezione

Utilizzare un nativo OS API se si ha realmente bisogno scrivere sul disco. O mkstemp() come suggerito.

+0

mktemp() è (o era) una funzione standard. Ad esempio in POSIX.1-2001. Ma non usarlo comunque. –

0

Uso mkstemp:

int fd = mkstemp(template); 

Dopo questa chiamata, template verrà sostituito con il nome del file vero e proprio. Avrai il descrittore del file e il percorso del file.

Problemi correlati