0
私はこのようなものがあります:-Wformat -Wformat-nonliteral
でクランを使用してコンパイルClangで特定の関数引数を安全な書式文字列としてマークする方法はありますか?
static void
my_varargs_internal (const char *prefix, const char *format, va_list args)
{
printf ("%s: ", prefix);
vprintf (format, args);
/* Other more complicated stuff which is why I want this to be a separate function */
printf ("\n");
}
void
__attribute__ ((format (printf, 1, 2)))
varargs_general (const char *format, ...)
{
va_list args;
va_start (args, format);
my_varargs_internal ("General", format, args);
va_end (args);
}
void
__attribute__ ((format (printf, 2, 3)))
varargs_specialized (const char *prefix, const char *format, ...)
{
va_list args;
va_start (args, format);
my_varargs_internal (prefix, format, args);
va_end (args);
}
を、私はvprintf
行に警告「書式文字列は、文字列リテラルではありません」を取得します。コンパイラがvarargs_general
またはvarargs_specialized
の呼び出しでそれをすでにチェックしているので、format
引数を既にチェックされた書式文字列としてマークする方法はありますか? format
属性ではできません。これは、varargs関数にのみ適用され、va_list
パラメータを持つ関数には適用されないためです。
GCCはこの状況を正しく理解しているように警告しません。
私はドキュメント内のその文章を完全に読みました。ありがとうございました! – ptomato