5

次のコードは、MISRAチェックで失敗します。具体的なエラーメッセージは次のとおりです。

(MISRA-C:2004 10.1 / R)整数型の式の値は、同じ符号のより広い整数型への変換でない場合、別の基になる型に暗黙的に変換されてはなりません。

typedef enum _MyEnum { One, Two } MyEnum;
MyEnum MyVariable;

int foo(void)
{
    int result = 1;

    if (One == MyVariable)  // fails here with MISRA-C:2004 10.1/R
    {
        result = 2;
    }    
    return result;
}
  • なぜ論理式が変換されるのですか?
  • ここで何が変換されますか?
  • Oneスワップして、コードがMISRAチェックに合格するのはなぜMyVariableですか?

編集:コンパイラはTI「MSP430C / C ++コンパイラv4.0.0」であり、MISRAルールチェックが含まれています。

4

3 に答える 3

6

MISRAチェッカーにバグはなく、正しく動作します。C標準に欠陥があり、非論理的であるため、このエラーが発生します。

2つのアイテムがあります:

  • One列挙定数です。int規格§6.7.2.2/2では、これは例外なく互換性があると規定されています。

  • MyVariable列挙型です。標準§6.7.7.2/4では、これはchar、符号付き整数型、または符号なし整数型と互換性がある必要があると規定されています。適用されるタイプは、実装定義の動作です。

あなたの場合、実装定義の列挙型はunsignedintと等しいように見えます。

そのため、コードはsignedintの変数をunsignedintに暗黙的に変換しようとしますが、これはMISRA200410.1の違反です。

MISRA準拠のコードはである必要がありますif (One == (MyEnum)MyVariable)

于 2012-05-24T08:24:02.930 に答える
0

内に負の値がない限り、コンパイラは内部でとして処理enumsするのではないかと思います。unsigned integerenum

于 2012-05-14T13:04:42.110 に答える
-1

コンパイラのバグが疑われます。どのコンパイラを使用していますか?この投稿では、TIのコンパイラを使用するときにMisra 10.1/Rの障害を引き起こすコンパイラのバグについて説明しています。

于 2012-05-14T11:49:03.750 に答える