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 }