Strictement parlant, il est vraiment dangereux de la fonction. Il est gets() parce que son entrée n'est pas sous le contrôle du programmeur. Toutes les autres fonctions mentionnées ici sont sûrs d'eux-mêmes. Les "bons" et "mauvais" se résume à une programmation défensive, à savoir les préconditions, postconditions et de code réutilisable.
Prenons la fonction strcpy() par exemple. Il a certaines conditions pour que le programmeur doit s'acquitter avant l'appel de la fonction. Les deux chaînes doivent être valides, non pointeurs NULL à zéro des chaînes terminées, et la destination doivent fournir suffisamment d'espace avec une finale de longueur de chaîne à l'intérieur de la gamme de size_t. En outre, les deux chaînes ne sont pas autorisés à se chevaucher.
Qui sont tout à fait beaucoup de conditions préalables, et aucune d'elles est contrôlée par la fonction strcpy(). Le programmeur doit s'assurer qu'elles sont remplies, ou il doit explicitement les tester avec d'autres code réutilisable avant d'appeler la fonction strcpy():
n = DST_BUFFER_SIZE;
if ((dst != NULL) && (src != NULL) && (strlen(dst)+strlen(src)+1 <= n))
{
strcpy(dst, src);
}
Déjà silencieusement en supposant que le non-recouvrement et à zéro des chaînes terminées.
strncpy() ne comprennent certaines de ces vérifications, mais il ajoute une autre postcondition le programmeur doit prendre soin, après l'appel de la fonction, parce que le résultat peut ne pas être égale à zéro terminée.
strncpy(dst, src, n);
if (n > 0)
{
dst[n-1] = '\0';
}
Pourquoi ces fonctions considéré comme "mauvais"? Car ils auront besoin supplémentaire de code réutilisable pour chaque appel à vraiment être sur le côté sûr, lorsque le programmeur suppose tort à propos de la validité, et les programmeurs ont tendance à oublier ce code.
Ou même de s'y opposer. Prendre le printf() de la famille. Ces fonctions renvoient un état qui indiquent l'erreur et de succès. Qui vérifie si la sortie vers stdout ou stderr réussi? Avec l'argument que vous ne pouvez pas faire quoi que ce soit quand le standard des canaux ne sont pas de travail. Eh bien, ce sujet rescueing les données de l'utilisateur et de terminer le programme avec une erreur indiquant un code de sortie? Au lieu de la solution de rechange possible de crash et brûler, plus tard, de corruption des données de l'utilisateur.
Dans un temps et de l'argent limitée de l'environnement, il est toujours la question de savoir combien de filets de sécurité que vous voulez vraiment et quel est le pire scénario? Si c'est un dépassement de tampon dans le cas de la str-fonctions, alors il est logique de les interdire et probablement fournir des fonctions wrapper avec les filets de sécurité déjà à l'intérieur.
Une dernière question à ce sujet: Ce qui fait de vous assurer que vos "bonnes" solutions de rechange sont vraiment bon?