0

まず、これは次のようなものです:整数型は暗黙的にどのように変換されますか? しかし、別の MISRA 警告が表示されます。

コンパイラは MISRA エラーを生成しませんが、静的解析ツールは生成します。進行中の工具メーカーとのチケットがあります。

与えられた:

#include <stdio.h>
enum Color {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE};

int main(void)
{
  enum Color my_color;
  my_color = BLUE;
  if (my_color == YELLOW)  // Generates MISRA violation, see below.
  {
     printf("Color is yellow.\n");
  }
  else
  {
     printf("Color is not yellow.\n");
  }
  return 0;
}

if静的分析ツールは、次のステートメントに対して MISRA 違反を生成しています。

MISRA-2004 Rule 10.1 violation: implicitly changing the signedness of an expression.
Converting "4", with underlying type "char" (8 bits, signed),
to type "unsigned int" (32 bits, unsigned) with different signedness.

コンパイラは正しいですか (欠陥を特定していません)、それとも静的解析ツールですか?

4

3 に答える 3

7

C 言語仕様によると、式の型は次のとおりです。

typedef enum Colors {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE} Colors_t;  

ですsigned int

また、言語によると、列挙項目の値は、列挙全体を含めることができる最小単位です。したがって、上記の列挙でBLUEは、タイプはsigned charです。

Colors_tの変数がと比較されると、静的解析ツールは MISRA 違反を報告しますBLUE

Colors_t my_color;
if (my_color == BLUE) // This generates a MISRA violation.

違反はsigned intと比較されsigned charます。

また、列挙型は一意の型ではないため、列挙型アイテムはエラーなしで他の列挙型と混在させることができます。

typedef enum Tree_Species {REDWOOD, CYPRUS, PALM, OAK, JUNIPER, SEGUARO} Tree_Species_t;
Tree_Species_t my_tree;
my_tree = BLUE;
于 2012-11-09T19:18:27.890 に答える
0

誰か (コンパイラまたは静的ツール) が、 enum がintと同じサイズおよび/または署名されていないと信じているようです。

私の Green Hills コンパイラには、上記の例のchar型を選択するオプション --short-enum (Enum に可能な最小の型を使用) があります。あなたのコンパイラにはそのようなオプションがありますか? 有効になっていますか?コンパイラは列挙型を「非標準」値にデフォルト設定しますか?

私の経験では、静的ツールは既定で言語仕様にかなりよく従っています。つまり、列挙型が int サイズであることを期待する必要があります。(参照用にこのリンクを参照してください: What is the size of an enum in C? )。ほとんどの静的ツールはコンパイラ コマンド ラインの使用法をスヌープするため、コンパイル時のオプションによって、列挙型がintsよりも小さいことを静的アナライザーに納得させることができます。

競合を解決するために、コンパイラと静的アナライザーのドキュメントを徹底的に確認することをお勧めします。ビルド プロセスにも注意してください (コンパイル時のオプション、デフォルトなど)。

于 2012-05-14T21:02:38.433 に答える
-1

の宣言の結果である可能性が高いmy_color

enum Color my_color;

これから「列挙型」を削除してみてください:

Color my_color;

静的アナライザーはおそらく、別の列挙型を宣言していると見なすため、10.1 違反になります。異なる型であるため、MISRA ルールでは、ある型を別の型に割り当てることを禁止しています。

于 2012-10-10T21:16:38.787 に答える