8
votes

Pourquoi "Strcat" est-il considéré comme "dangereux"?

Dupliqué possible: strong>
Pourquoi MSVC ++ considère-t-il "std :: strcat" à être "dangereux "? (C ++) P>

voici mon code: p> xxx pré>

tandis que le débogage de MSVC ++, il me donne ces messages d'avertissement: p>

Warning 1   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead.
Warning 2   warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. 


0 commentaires

3 Réponses :


2
votes

parce que c'est légal xxx

qui vous permettra de modifier quoi que ce soit sur la pile au-delà du tableau de la phrase. Vous pouvez inconnoiser des bugs en écrasant d'autres variables de pile sans la langue ou le système d'exploitation vous arrêter. De plus, il y a un énorme problème de sécurité - des trucs sur la pile incluent les pointeurs de retour à la fonction pour revenir. Un attaquant intelligent pourrait insérer un pointeur de retour à leur code dans vos données leur permettant d'exécuter tout ce qu'ils veulent.

Je recommande d'éviter les cordes de style C dans la mesure du possible. Utilisez STD :: String si possible et le Microsoft Recommende Améliorations de sécurité au C STD LIB lorsque vous devez absolument travailler avec C Strings.


1 commentaires

Quant à la réparer, utilisez plutôt STRNCAT et passez dans un compte qui garantit que la chaîne de «phrase» ne déborde pas.



19
votes

C'est parce qu'il n'y a rien à vous arrêter de Strcat -ing plus de 100 octets dans votre tampon de phrase , avec des résultats non définis jusqu'à la corruption du tas, la corruption de pile, la corruption de pile , sortie du programme, même quelqu'un possédant votre machine si les données passées dans le 100e octet sont construites de manière appropriée. Il s'agit d'une classe commune de vulnérabilité de sécurité appelée Overflow tampon .

Pour éviter cela, utilisez std :: string 's opérateur + , ceci est C ++ après tout. Le CRT n'a pas besoin de vous limiter.


3 commentaires

+1 pour recommander std :: string qui est toujours la bonne réponse à une question comme celle-ci en C ++.


Je pense que STRNCAT est une façon parfaitement raisonnable de le faire, surtout comme il utilise des chaînes C dans cet exemple de toute façon.


@Max, oui cela ferait une bonne réponse alternative. Je préfère simplement éviter CRT si dans le code C ++, pour des raisons telles que la question ci-dessus.



0
votes

Vous pouvez utiliser strcat_s pour corriger les surcharges de tampon potentielles.


1 commentaires

strncat est plus standard. Strcat_s est une norme proposée, mais elle n'est nulle part près de manière universelle.