Il s'agit d'un message d'erreur que vous voyez chaque fois que vous vous trouvez dans une situation comme la suivante :
char* pointer_to_nonconst = "string literal";
Pourquoi ? Eh bien, le C et le C++ diffèrent dans le type de la chaîne littérale. En C, le type est array of char et en C++, il est constant tableau de caractères. Dans tous les cas, vous n'êtes pas autorisé à modifier les caractères de la chaîne littérale, donc le const en C++ n'est pas vraiment une restriction mais plutôt une sécurité de type. Une conversion de const char*
a char*
n'est généralement pas possible sans un moulage explicite pour des raisons de sécurité. Cependant, pour des raisons de compatibilité ascendante avec le C, le langage C++ permet toujours d'assigner un littéral de chaîne de caractères à un objet de type char*
et vous donne un avertissement sur le fait que cette conversion est obsolète.
Donc, quelque part, il vous manque un ou plusieurs const
dans votre programme pour vérifier l'exactitude des constantes. Mais le code que vous nous avez montré n'est pas le problème car il ne fait pas ce genre de conversion dépréciée. L'avertissement doit provenir d'un autre endroit.
2 votes
Vous devez utiliser
strncpy(str, func, 255)
au lieu destrcpy(str, func)
pour une copie plus sûre. Et n'oubliez pas d'ajouter le ' \0 à la fin de la chaîne puisque strncpy ne l'ajoute pas.3 votes
Il est encore plus sûr de dire "strncpy(str, func, sizeof(str)) ; str[sizeof(str) - 1] = '". \0 ' ;"
3 votes
Je ne pense pas que le code ci-dessus donne l'avertissement que vous avez cité, bien que je sois sûr qu'un code assez similaire le ferait. Afin d'obtenir des réponses significatives, vous devriez poster un exemple minimal et compilant qui produit l'avertissement.
3 votes
@Patrice, Warren : n'utilisez pas strncpy, ce n'est pas une version plus sûre de strcpy. Utilisez (ou réimplémentez) strcpy_s.
0 votes
J'ai compris le problème, il ne montre ces problèmes que pour une construction -X86 et pas pour les constructions normales de solaris ou ARM(target) donc je l'ignore. Je n'ai pas pu trouver de solution car il ne montre pas d'avertissement normalement pour mon code d'exemple également. Merci à tous !
0 votes
@mkamthan : Cet avertissement est très probablement déclenché parce qu'un littéral de chaîne est traité comme une mémoire inscriptible. Il s'agit d'une faille très dangereuse (et donc dépréciée) dans la norme C++ actuelle, qui n'est là que pour permettre à un vieux code peu soigné de continuer à compiler. Vous feriez mieux d'aller au fond des choses. Prendre une copie du code original et le réduire à un petit cas de reproduction est la meilleure façon de découvrir la cause de ce problème. Gagnez du temps maintenant, et il est très probable que vous le regretterez plus tard.
0 votes
Regardez cette réponse : stackoverflow.com/questions/1530469#1530469
0 votes
@SteveJessop : Voulez-vous dire
strcpy_s
car il fonctionne lorsque le gestionnaire fait unabort
? Parce que sinon, c'est vraiment dommage.0 votes
@Deduplicator : si vous implémentez votre propre version pour l'utiliser dans une application ou une bibliothèque particulière, alors vous n'avez pas nécessairement besoin d'implémenter la possibilité de définir le gestionnaire. Il suffit de lui faire faire ce que vous auriez voulu qu'il fasse. Ce qui devrait probablement se terminer par un abandon, mais vous pourriez être en mesure de faire de la journalisation ou autre chose avant.
0 votes
@SteveJessop : Ce que je veux dire, c'est que le fait de faire dépendre le comportement des fonctions du gestionnaire qui est défini est l'une des erreurs de conception fondamentales de cet ensemble de fonctions.
0 votes
Si quelqu'un est ici comme moi pour vérifier comment déclarer un littéral de chaîne constexpr, vérifiez cette réponse : stackoverflow.com/a/46100521/3994640