10
votes

Strcat vs STRNCAT - Quand la fonction doit-elle être utilisée?

Certains outils d'analyseur de code statique suggèrent que toute utilisation de Strcat doit être remplacée par STRNCAT à des fins de sécurité?

Dans un programme, si nous savons clairement la taille du tampon cible et des tampons source, est-il toujours recommandé d'aller pour Strncat?

En outre, étant donné les suggestions par des outils statiques, devraient être utilisées sans cesse?


0 commentaires

5 Réponses :


12
votes

Si vous êtes absolument sûr de la taille du tampon de source et que la mémoire tampon source contient un caractère null terminant la chaîne, vous pouvez utiliser Strcat en toute sécurité lorsque le tampon de destination est suffisamment grand.

Je recommande toujours d'utiliser STRNCAT et donnez-lui la taille du tampon de destination - longueur de la chaîne de destination - 1

Remarque: j'ai édité cela depuis que les commentaires ont noté que ma réponse précédente était horriblement fausse.


3 commentaires

+1. Je soulignerais que dans certains systèmes (BSD, par exemple), le compilateur vous avertit si vous utilisez des fonctions de manipulation de chaîne 'Taille-générique' (Strcat, Strcpy, etc.)


Je pense que vous voulez dire "... Donnez-lui la taille du tampon de destination moins la taille de la chaîne qu'il contient déjà "


Cette réponse est dangereusement fausse. @Nemo est de plus près, mais je pense toujours à un. La réponse de Pankaj semble précise et est très détaillée. Il doit être 'Taille du tampon de destination - Longueur de la chaîne de destination - 1' pour éviter de manière appropriée des débordements de tampon. Bien que cela semble un choix idiot dans la conception de cette fonction puisqu'il doit rechercher intrinsèquement le terminateur NULL avant de commencer à copier de toute façon et pourrait calculer la longueur en cours de route afin de ne pas avoir à le faire deux fois.



1
votes

Ils ne font pas la même chose afin qu'ils ne puissent pas être substitués les uns les autres. Les deux ont des modèles de données différents.

  • une chaîne pour strcat est un null chaîne terminée pour laquelle vous (en tant que programmeur) garantit qu'il a suffisamment d'espace.
  • une chaîne pour strncat est une séquence de char qui est soit terminé à la longueur, vous indiquez ou par une résiliation null si elle est censé être plus court que ça longueur.

    L'utilisation de ces fonctions dépend simplement des hypothèses que vous pouvez (ou souhaitez-il) faire de vos données.


0 commentaires

0
votes

Les outils statiques sont généralement médiocres pour comprendre les circonstances autour de l'utilisation d'une fonction. Je parie que la plupart d'entre eux viennent de vous avertir pour chaque strcat rencontré au lieu de regarder si les données transmises à la fonction sont déterministes ou non. Comme déjà mentionné, si vous avez le contrôle de vos données d'entrée, aucune fonction n'est dangereuse.

Notez que Strncat () est légèrement plus lent, car il doit vérifier la résiliation «\ 0» et un compteur, et également explicitement de l'ajouter à la fin. STRACAT () D'autre part, vérifie "\ 0 ', et il ajoute la trailing' \ 0 'à la nouvelle chaîne en copiant le terminateur de la deuxième chaîne avec toutes les données.


0 commentaires

13
votes

concaténate deux chaînes dans une seule chaîne.

prototypes xxx

DESCRIPTION

strcat () et strncat () fonctions ajouter une copie de la null-résiliation String S2 jusqu'à la fin de la chaîne S1 terminée NULL, puis ajoutez une terminaison \ 0 '. La chaîne S1 doit avoir suffisamment d'espace pour tenir le résultat.

la fonction STRNCAT () ajoute non plus que n caractères de S2, et ajoute ensuite une terminaison \ 0 '.

Les chaînes source et destination ne doivent pas se chevaucher, car le comportement est indéfini.

valeurs de retour xxx

Considérations de sécurité

la fonction strcat () est facilement mal utilisé de manière à permettre aux utilisateurs malveillants de changer de manière arbitraire la fonctionnalité d'un programme d'exécution à travers une attaque de débordement tampon.

Évitez d'utiliser strcat () . Au lieu de cela, utilisez strncat () ou strlcat () et assurez-vous que plus de caractères ne sont copiés sur le tampon de destination que ce qu'il ne peut Hold.

Notez que strncat () peut également être problématique. Il peut s'agir d'une préoccupation de sécurité pour qu'une chaîne soit tronquée du tout. Depuis la chaîne tronquée ne sera pas aussi long que l'original, il peut se référer à une ressource complètement différente et à une utilisation de la ressource tronquée pourrait entraîner très un comportement incorrect. Exemple: xxx

Exemple xxx


3 commentaires

Bonjour, les commentaires latéraux ne reflètent pas la production réelle du programme, car SRC a été défini comme monde (majuscule W) et le monde des états de production (minuscule W).


@Eduardo :) Merci. Corrigé maintenant.


"Les fonctions STRCAT () et STRNCAT () Ajoutez une copie de la chaîne S2 Terminé NULL à la fin" n'est pas la fois pour strncat () . S2 Ne doit pas nécessairement être une chaîne null terminée . Il suffit que s2 soit un tableau de chracter qui peut manquer de caractère null .



-2
votes

C'est très simple Strcat est utilisé pour concaténer deux chaînes, par exemple

a= data structures


0 commentaires