7

snprintfタイプのパラメータで「%f」指定子を使用すると、MISRAタイプのエラーが発生しますfloat

私の調査によると、「%f」はのタイプを想定しているため、MISRAは正しいですdouble

float型パラメーターではなく型パラメーターを使用する浮動小数点指定子または修飾子はありdoubleますか?

私は組み込みシステムで作業していますがdouble、関数を満足させるためだけに32ビット浮動小数点から64ビットに変換したくありませんsnprintf。コードはデバッグ/コンソールポートに出力され、これが変換が行われる唯一の場所です。

コード例が必要な方のために:

// This section is for those C++ purists and it fulfills the C++ tag.
#if __cplusplus
#include <cstdio>
#else
#include <stdio.h>
#endif

#define BUFFER_SIZE (128U)

int main(void)
{
    char buffer[BUFFER_SIZE];
    float my_float = 1.234F;

    // The compiler will promote the single precision "my_float"
    //   to double precision before passing to snprintf.
    (void)snprintf(buffer, BUFFER_SIZE, "%10.4f", my_float);
    puts(buffer);
    return 0;
}

SOとWebに関する私の研究はすべて、浮動小数点値の出力に関するものであり、float昇格doubleが行われないようにパラメーターを必要とする指定子に関するものではありません。

ARM7TDMIプロセッサ用のIAREmbeddedWorkbenchコンパイラを使用しています。

4

4 に答える 4

21

いいえ、printfとその仲間は可変個引数関数であるため、floatパラメーターはデフォルトの引数昇格doubleの一部として自動的に変換されます(C99標準のセクション6.5.2.2を参照)。

なぜこれがMISRA警告をトリガーするのかはわかりませんが、これが危険である可能性がある方法は考えられません。

于 2013-01-09T01:40:04.140 に答える
9

いいえ、ありません。標準のプロモーションでは、変数パラメータリストを通過floatするときにすべての引数がに変換されるためです。double

于 2013-01-09T01:40:04.267 に答える
5

正しいMISRA-C:2004コンプライアンス分析では、次のようになります。

  • 1.1に違反すると、コードはISO 9899:1990(C ++コード、C99コード)に準拠しません。
  • 2.2の違反、//コメントの使用。
  • 16.1の違反、可変引数関数の使用。
  • 20.9の違反、stdio.hの使用。

上記以外のエラーが発生した場合は、静的アナライザーが壊れている可能性があります。

手動で分析したほか、LDRATestbed7.6.0を使用して分析しました。

于 2013-01-09T13:59:47.107 に答える
0

自動昇格のため、printf関数でdoubleの代わりにfloatを指定することはできませんが、コードを次のように変更できると思います。

(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", my_float);

に:

(void)snprintf(buffer, BUFFER_SIZE, "%10.4f", (double)my_float);

正しい結果を達成します

于 2015-08-25T10:02:19.743 に答える