Des avertissements comme «WCSTOK»: cette fonction ou variable peut être dangereuse. Envisagez d'utiliser WCSTOK_S à la place

StackOverflow https://stackoverflow.com/questions/6007594

  •  14-11-2019
  •  | 
  •  

Question

J'utilise simplement ces littéraux de personnages larges dans mon code pour les apprendre à ce sujet

     wchar_t* wpsub = wcstok(names, names_delim);
     wpsub = wcstok(NULL, names_delim);
     wchar_t* wcopied=new wchar_t[wcslen(wname) + 1];
     strcpy(nameptr, "singh");
     wcscpy(wcopied, wname);
     wcscat(wcopied, L" Singh");

Pourquoi est-ce que je reçois ces avertissements, je l'ai ignoré quand même. Avons-nous besoin d'ignorer de tels avertissements.

    : warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcstok'
    : warning C4996: 'wcstok': This function or variable may be unsafe. Consider using wcstok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcstok'
    : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'strcpy'
    : warning C4996: 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcscpy'
    : warning C4996: 'wcscat': This function or variable may be unsafe. Consider using wcscat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    : see declaration of 'wcscat'
Était-ce utile?

La solution

Il y a une autre raison de ne pas utiliser l'original Fonction de la famille Strtok:

...] Cependant, dans un seul fil, Les appels entrelacés à l'une de ces fonctions sont très susceptibles de produire de la corruption des données et des résultats inexacts. Lorsque vous analysez différentes chaînes, terminez l'analyse d'une chaîne avant de commencer à analyser la suivante. Soyez également conscient du potentiel de danger lorsque vous appelez l'une de ces fonctions à partir d'une boucle où une autre fonction est appelée. Si l'autre fonction finit par utiliser l'une de ces fonctions, une séquence d'appels entrelacée en résultera, déclenchant la corruption des données.

La raison en est que strtok n'est pas réentrant: lorsqu'il est conçu, on pensait qu'il serait une bonne idée qu'il utilise une variable globale comme référentiel pour le contexte (comment avez-vous pensé strtok peut se rappeler où continuer entre chaque appel de fonction?).

Le passé est le passé, et nous ne devons pas juger le code il y a des décennies, mais ensuite, avec toutes les nouvelles normes (C99 me vient à l'esprit), je suis toujours surpris que cette fonction n'a pas été refactorisée.

À tout le moins, le Strtok_s Famille de fonction Produit par Microsoft utilise une variable fournie par l'utilisateur pour celle-ci (appelée context). Si vous avez le choix, pour le code de production, utilisez strtok_s.

Et si vous avez besoin de fournir du code multiplateforme, mon conseil est:

  1. Écrivez une fonction qui sera utilisée comme indirection à la vraie
  2. Sur Windows, redirigez vers Strtok_s
  3. Sur n'importe quelle plate-forme où il y a un strtok sûr (j'ai trouvé strtok_r Lors de la recherche sur Google), redirigez vers cette fonction
  4. Sur les plates-formes où il n'y a pas de strtok sûr, écrivez le vôtre (c'est loin d'être difficile et c'est un bon exercice pour apprendre la programmation)

Maintenant, il existe des alternatives C ++ à ces fonctions C, soit en combinant std::string méthodes ensemble, ou en utilisant boost :: tokenizer

Autres conseils

Vous devriez utiliser std::wstring et std::string et des fonctions de bibliothèque standard C ++ similaires, au lieu de ces fonctions, car elles sont sensibles aux dépassements de tampon et à d'autres problèmes de sécurité (sans parler de la fiabilité de l'application).

La wcstok est sensible aux exploits de dépassement de tampon. Le compilateur vous recommande d'utiliser une version alternative qui traite de cette menace.

Veuillez vous référer aux remarques du MSDN Documentation pour wcstok.

Si vous avez un contrôle complet des données qui sont passées à wcstok Ensuite, vous n'avez aucune cause de préoccupation. Si les données passaient à wcstok pourrait alors être fourni par l'utilisateur qui crée le potentiel d'une attaque de dépassement de tampon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top