メインコンテンツ

書式文字列指定子と引数の不一致

printf のような関数で、書式指定子が対応する引数と一致していません

説明

この欠陥は、printf などの書式設定付き出力関数内の書式指定子が、それに対応する引数と一致しない場合に発生します。たとえば、unsigned long 型の引数の書式指定は %lu でなければなりません。

リスク

書式指定子と対応する引数の間の不一致により、未定義の動作が発生します。

修正方法

書式指定子が対応する引数と一致することを確認します。たとえば、次の例では、%d 指定子は文字列引数 message に一致せず、%s 指定子は整数引数 err_number に一致しません。

  const char *message = "License not available";
  int err_number = -4;
  printf("Error: %d (error type %s)\n", message, err_number);
2 つの書式指定子を入れ替えると、問題が修正されます。書式指定子の詳細は、関数 printf の仕様を参照してください。

認識される引数のデータ型が整数プロモーションによって変更された場合、解析結果に元の型とプロモーション後の型の両方が示されます。書式指定子は整数プロモーション後の型と一致していなければなりません。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%d\n", fst);
}

printf ステートメントで、書式指定子 %dfst のデータ型と一致していません。

修正 — 符号なしの long 書式指定子を使用

1 つの修正方法として、%lu 書式指定子を使用することができます。この指定子は fstunsigned 整数型および long サイズに合致します。

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%lu\n", fst);
}
修正 — 整数引数を使用

1 つの修正方法として、書式指定子と一致するように引数を変更することができます。fst を書式指定子と一致するよう整数に変換し、値 1 を出力します。

#include <stdio.h>

void string_format(void) {

    unsigned long fst = 1;

    printf("%d\n", (int)fst);
}

結果情報

グループ: プログラミング
言語: C | C++
既定値: オン
コマンド ライン構文: STRING_FORMAT
影響度: Low

バージョン履歴

R2013b で導入