Correction de l’avertissement «La chaîne de format n’est pas une chaîne»

J’ai un avertissement dans mon code qui me rend fou:

int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) { // Do stuff... // ... return vasprintf(bufptr, fmt, ap); } 

Clang (3.6.0) se plaint de “la chaîne de format n’est pas une chaîne”, faisant référence à l’argument fmt cours de transmission.

Naïvement, j’ai essayé de:

 return vasprintf(bufptr, reinterpret_cast(fmt), ap); 

Ce qui bien sûr ne comstack pas.

Que fais-je? Désactiver l’avertissement n’est pas une option. Je veux avoir l’avertissement. Mais dans ce cas, je voudrais dire au compilateur que je sais ce que je fais (blagues “fameux derniers mots” à part …)

Vous pouvez indiquer à Clang que votre paramètre est un format de style printf à l’aide de l’indicateur d’ atsortingbut . Voir la documentation

Dans votre cas, quelque chose comme ceci devrait marcher:

 __atsortingbute__((__format__ (__printf__, 2, 0))) int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) { ... } 

Edit: Modifie le dernier paramètre en 0 conformément à la suggestion de Cornstalks (désactive la vérification des parameters va_list ).

L’indicateur d’avertissement qui active ce type d’avertissement est -Wformat-nonliteral . Puisque vous ne voulez pas désactiver complètement cet avertissement, vous pouvez le désactiver localement en utilisant le code suivant:

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wformat-nonliteral" ... #pragma clang diagnostic pop 

Donc, votre fonction ressemblerait à ceci:

 int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) { // Do stuff... // ... #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wformat-nonliteral" return vasprintf(bufptr, fmt, ap); #pragma clang diagnostic pop }