2009-04-12 6 views
6

Comment puis-je supprimer suite avertissement de linker gcc:Suppress Avertissement: l'utilisation de `mktemp » est dangereux

Avertissement: l'utilisation de 'mktemp' est dangereux, une meilleure utilisation mkstemp '

Je sais qu'il est préférable d'utiliser mkstemp() mais pour une raison quelconque, je dois utiliser la fonction mktemp().

+0

Utilisez mkstemp au lieu de mktemp. –

+3

Quelle est la raison pour laquelle vous devez utiliser mktemp? –

Répondre

8

Je suppose que vous avez besoin du chemin car vous le passez à une bibliothèque qui n'accepte que les noms de chemin en tant qu'argument et non en tant que pointeur de fichier ou pointeur FILE. Si c'est le cas, vous pouvez créer un répertoire temp avec mkdtemp et y placer votre fichier, le nom réel n'est alors pas important car le chemin est déjà unique à cause du répertoire.

+7

Vous pouvez absolument encore utiliser mkstemp: int fd = mkstemp (template); Après cet appel, le modèle sera remplacé par le nom du fichier réel. Vous aurez le descripteur de fichier et le chemin du fichier. –

+0

@Jason Coco vous pourriez envisager de faire une réponse, de sorte qu'il peut être upvoted ;-) – lothar

+0

@Jason Coco, ah ok, cela semble raisonnable :). Je suis d'accord avec Lothar pour faire une réponse. – quinmars

4

Si vous avez utiliser mktemp alors il n'y a rien que vous pouvez faire pour supprimer ce court avertissement de retrait de la section qui utilise mktemp de libc.so.6.

Pourquoi avez-vous pour utiliser mktemp?

0

Si vous liez statiquement le runtime, l'autre option consiste à écrire votre propre version de mktemp dans un fichier objet. L'éditeur de liens devrait préférer votre version sur la version d'exécution.

Modifier: Merci à Jason Coco pour avoir signalé un malentendu majeur que j'ai eu dans mktemp et ses proches. Celui-ci est un peu plus facile à résoudre maintenant. Puisque l'éditeur de liens préférera une version dans un fichier objet, il vous suffit d'écrire mktemp en termes de mkstemp.

Les seules difficultés sont le nettoyage des descripteurs de fichiers que mkstemp reviendra à vous et rendra tout thread sûr. Vous pouvez utiliser un tableau statique de descripteurs et une fonction atexit -enregistrée pour le nettoyage si vous pouvez mettre un plafond sur le nombre de fichiers temporaires dont vous avez besoin. Sinon, utilisez simplement une liste chaînée à la place.

+1

@D: Il est erroné de fournir une chaîne constante à mkstemp ou à mktemp, car l'appel de bibliothèque tentera de modifier la chaîne et vous obtiendrez une erreur de bus. –

4

Deux choses:

  • mktemp n'est pas une fonction standard
  • l'avertissement est un spécial mis en œuvre dans l'éditeur de liens comme .gnu.warning.mktemp section

Utilisez un API OS natif si vous avez vraiment besoin écrire sur le disque. Ou mkstemp() comme suggéré.

+0

mktemp() est (ou était) une fonction standard. Par exemple dans POSIX.1-2001. Mais ne l'utilisez pas quand même. –

0

Utilisation mkstemp:

int fd = mkstemp(template); 

Après cet appel, template sera remplacé par le nom du fichier. Vous aurez le descripteur de fichier et le chemin du fichier.

Questions connexes