2016-10-04 7 views
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はこの状況を正しく理解しているように警告しません。

答えて

1

Iが使用警告を抑制することができた:第三の指定、引数は(vprintfなど) をチェックするために利用できない機能についてDeclaring Attributes of Functions:

に基づい

static void 
__attribute__ ((format (printf, 2, 0))) 
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"); 
} 

をパラメータを0に設定します。

+0

私はドキュメント内のその文章を完全に読みました。ありがとうございました! – ptomato

関連する問題