10.37 __attribute__((format)) 関数属性

この属性により、コンパイラは、指定された関数に対して提供された引数が正しい形式であることを確認します。

構文

__attribute__((format(function, string-index, first-to-check)))
ここで、functionprintf()scanf()strftime()gnu_printf()gnu_scanf()gnu_strftime()strfmon() などの printf スタイル関数です。
string-index は、関数内の文字列引数のインデックスを指定します(1 から開始)。
first-to-check はフォーマットストリングに照らして確認する最初の引数のインデックスです。

#include <stdio.h>

extern char *myFormatText1 (const char *, ...);
extern char *myFormatText2 (const char *, ...)__attribute__((format(printf, 1, 2)));


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

  a = 5;
  b = 6;
  c = 9.099999;

myFormatText1("Here are some integers: %d , %d\n", a, b); // 型の確認なし。型は一致しています。
myFormatText1("Here are some integers: %d , %d\n", a, c); // 型の確認なし。型は一致しませんが、警告なし。


myFormatText2("Here are some integers: %d , %d\n", a, b); // 型の確認なし。型は一致しています。
myFormatText2("Here are some integers: %d , %d\n", a, c); // 型の確認なし。警告:181-D:引数には互換性がありません...
}				
myFormatText1() は出力する 1 つの文字列と 2 つの引数が指定される関数です。フォーマットチェックはないため、整数が必要なときに浮動小数点引数が渡されると、暗黙の型の不一致が発生します。
myFormatText2() は、__attribute__((format())) があることを除き、myFormatText1() と同じです。予想外の型の引数を受け取ると、警告メッセージが発生します。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.