Ceci est inspiré par cette question et les commentaires sur une réponse particulière dans laquelle j'ai appris que strncpy
n'est pas une fonction de traitement des chaînes de caractères très sûre en C et qu'elle remplit les zéros, jusqu'à ce qu'elle atteigne n
ce dont je n'étais pas conscient.
Plus précisément, pour citer R..
strncpy ne termine pas à zéro, et le reste du tampon de destination, ce qui est tampon de destination, ce qui est un énorme perte de temps. Vous pouvez contourner le premier en ajoutant votre propre null padding, mais pas le second. Le site n'a jamais été conçu pour être utilisé comme un fonction de "manipulation sûre des chaînes de caractères", mais pour travailler avec des champs de taille fixe dans les et les fichiers de base de données. snprintf(dest, n, "%s", src) est la seule fonction de seul "strcpy sûr" correct en C standard, mais il est C standard, mais il est probable qu'elle soit beaucoup plus lente. D'ailleurs, la troncature en elle-même peut être un bogue majeur et, dans certains cas, peut conduire à une élévation de privilèges ou à un DoS, donc de jeter des fonctions de chaîne "sûres" qui qui tronquent leur sortie en cas de problème n'est pas problème n'est pas une façon de le rendre "sûr" ou ou "sécurisé". Au lieu de cela, vous devez vous assurer que le tampon de destination est de la la bonne taille et utiliser simplement strcpy (ou mieux encore, memcpy si vous connaissez déjà la longueur de la chaîne source).
Et de Jonathan Leffler
Notez que l'interface de strncat() est encore plus encore plus confuse dans son interface que strncpy() - quel est exactement cet argument de longueur longueur, déjà ? Ce n'est pas ce que Ce n'est pas ce que l'on attendrait en fonction de ce que l'on fournit strncpy() etc - il est donc plus sujet à des erreurs d'erreurs, même que strncpy(). Pour copier des chaînes de caractères, je suis de plus en plus l'opinion qu'il y a un argument fort pour arguments pour dire que vous n'avez besoin que de memmove() parce que vous connaissez toujours toutes les tailles à l'avance et on s'assure qu'il y a qu'il y a assez d'espace à l'avance. Utilisez memmove() de préférence à l'une des méthodes suivantes strcpy(), strcat(), strncpy(), strncat(), memcpy().
Donc, je suis clairement un peu rouillé sur la bibliothèque standard C. Par conséquent, je voudrais poser la question :
Quelles fonctions de la bibliothèque standard C sont utilisées de manière inappropriée/d'une manière qui peut causer/entraîner des problèmes de sécurité/des défauts de code/des inefficacités ?
Dans un souci d'objectivité, j'ai un certain nombre de critères pour une réponse :
- Veuillez, si vous le pouvez, citer les raisons de la conception de la fonction en question, c'est-à-dire sa finalité.
- Veuillez mettre en évidence le mauvais usage qui est fait de ce code.
- Veuillez indiquer pourquoi cette mauvaise utilisation peut conduire à un problème. Je sais que cela devrait être évident mais cela évite les réponses molles.
Veuillez éviter :
- Débats sur les conventions de dénomination des fonctions (sauf lorsque cela entraîne sans équivoque une confusion).
- "Je préfère x à y" - les préférences sont acceptables, nous en avons tous, mais je m'intéresse aux effets secondaires inattendus et à la manière de s'en prémunir.
Comme cette question est susceptible d'être considérée comme subjective et qu'elle n'a pas de réponse définitive, je la signale d'emblée au wiki communautaire.
Je travaille également selon la norme C99.