10.38 __attribute__((format_arg(string-index))) 関数属性

この属性では、関数が引数としてフォーマットストリングを取るように指定されます。フォーマットストリングには、printf()scanf()strftime()strfmon() などの printf-style 関数に渡されることを意図した、型指定されたプレースホルダを含めることができます。

この属性を指定すると、コンパイラは、関数の出力を printf スタイル関数への呼び出しで使用する場合に、指定した引数でプレースホルダーの型チェックを実行します。

この関数属性は、ARM コンパイラがサポートする GNU コンパイラ拡張機能です。

構文

__attribute__((format_arg( string-index )))
ここで、 string-index は、フォーマットストリング引数(1 から開始)である引数を指定します。

以下のサンプルでは、フォーマットストリングを printf() に提供する 2 つの関数 myFormatText1()myFormatText2() を宣言します。
最初の関数 myFormatText1() は、format_arg 属性を指定しません。コンパイラは、フォーマットストリングとの一貫性について printf 引数の型を確認しません。
2 番目の関数 myFormatText2() は、format_arg 属性を指定します。printf() への次の呼び出しで、コンパイラは、提供された引数の型 a および bmyFormatText2() へのフォーマットストリング引数と一貫していることを確認します。コンパイラは、int を使用できる場合に float が提供されると、警告を生成します。
#include <stdio.h>

// printf によって使用される関数。フォーマットの型の確認なし。
extern char *myFormatText1 (const char *);

// printf によって使用される関数。引数 1 でフォーマットの型の確認。
extern char *myFormatText2 (const char *) __attribute__((format_arg(1)));


int main(void) {
  int a;
  float b;

  a = 5;
  b = 9.099999;

  printf(myFormatText1("Here is an integer:%d\n"), a); // 型の確認なし。いずれにせよ型は一致しています。
  printf(myFormatText1("Here is an integer:%d\n"), b); // 型の確認なし。型は一致しませんが、警告はありません

  printf(myFormatText2("Here is an integer:%d\n"), a); // 型の確認。型は一致しています。
  printf(myFormatText2("Here is an integer:%d\n"), b); // 型の確認。型が一致しない場合は警告:#181-D
}
      

$ armcc format_arg_test.c -c
"format_arg_test.c"、行 18:警告:#181-D:引数は対応するフォーマットストリング変換と互換性がありません
     printf(myFormatText2("Here is an integer:%d\n"), b);
                                                       ^
format_arg_test.c:警告 1 つ、エラーなし

      
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.