7

私は次のものを持っています:

typedef struct
{
   uint8_t BlockID;
   uint32_t Copies;
   uint16_t Size;
}NVMM_ConfigType;

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   {  1, 1,   4},
   {  2, 3,   4},
   {  5, 5,  16},
   { 10, 1,   4},
   { 11, 2,  32},
   { 13, 1, 100},
};

私には問題ないように思えますが、MISRA-C は次のエラーを出しています:

MISRA C:2012 ルール 10.3 違反: [R] 式の値は、より狭いエッセンシャル タイプまたは異なるエッセンシャル タイプ カテゴリのオブジェクトに割り当てられません。

なぜこれが起こっているのかを理解しようとしましたが、それを見ることができます。また、ビルド結果は同様の状況でこのエラーに悩まされており、その理由はわかりません。

何が起こっているのか知っている人はいますか?

編集:私はまた、すべての値を明示的にキャストしようとしましたが、それでも同じエラーが発生します:

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
    {  (uint8_t)1, (uint32_t)1,   (uint16_t)4},
    {  (uint8_t)2, (uint32_t)3,   (uint16_t)4},
    {  (uint8_t)5, (uint32_t)5,  (uint16_t)16},
    { (uint8_t)10, (uint32_t)1,   (uint16_t)4},
    { (uint8_t)11, (uint32_t)2,  (uint16_t)32},
    { (uint8_t)13, (uint32_t)1, (uint16_t)100},
};
4

3 に答える 3

5

(こんにちは、これは新しいアカウントなので、コメント セクションを使用してさらに説明を求めることはできません。長い返信をお許しください)

具体的に言うと、このルール 10.3 は MISRA-C:2012 (最新の標準) に関連しています。これは、MISRA の理論的根拠を説明するためにより多くの努力が払われ、より多くの準拠および非準拠の例があるという点で、以前のバージョンよりも大幅に改善されています。

このルールの論理的根拠は次のとおりです。C では異なる算術型間の代入を自動的に実行できるため、これらの暗黙的な変換を使用すると、値、符号、または精度が失われる可能性があり、意図しない結果が生じる可能性があります。MISRA_C:2012 には、これが発生する可能性がある場合に警告するのに役立つ重要な型モデルがあります。

ルールの説明には、ルールの例外も含まれています。規則 10.3 の場合、1 つの例外は次 のとおりです。本質的に符号付きの型の負でない整数定数式は、その値をその型で表すことができる場合、本質的に符号なしの型のオブジェクトに割り当てることができます。

ツールが違反を報告している正確な行と列が明確ではありません(そうすべきです)。より優れたツールは、違反しているルールの正確な部分に関するより詳細な情報も提供します (たとえば、8 ビットへの最初の割り当てで 1 ではなく 128 があった場合、ツールはそれについて非常に明確にする必要があります)。 )。

いずれにせよ、私は (私のツールも) 10.3 の違反は見ません。

これは「決定可能な」ルールであるため、これがセーフティ クリティカルなコードである場合、時間を無駄にしているという事実に加えて、ツールについて心配します。

ほとんどのツールでは、警告を抑制し、その理由を文書化できます (この場合、ツールのバグです)。

ツール ベンダーにさらに詳しい情報が必要な場合は、http://www.misra-c.comのディスカッション フォーラムに質問を投稿して、公式の回答を得て、それをベンダーに転送してください。

于 2015-07-31T21:21:11.783 に答える
1

うーん、そのルールは8ビットレジスタの設定を実際には不可能にします。算術演算はasint以上で実行されるためです(通常の算術変換)。MISRA をコーディング標準として拒否するもう 1 つの理由。

イニシャライザのすべての値をそれぞれのフィールドの型にキャストする必要があると思います。しかし、ルールが引用されているように、それは依然として違反です.

于 2015-07-30T14:49:35.693 に答える
0

PC-Lint を使用して Misra ルールをチェックするとu、定数に接尾辞を追加する必要があることがよくあります。

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   {  1u, 1u,   4u},
   {  2u, 3u,   4u},
   {  5u, 5u,  16u},
   { 10u, 1u,   4u},
   { 11u, 2u,  32u},
   { 13u, 1u, 100u},
};

intこれによりtounsigned変換がなくなります。

これで十分でない場合は、次のようにキャストします。

const NVMM_ConfigType NvmmCnf_Layout[6] =
{
   { (uint8_t ) 1u, 1u, (uint16_t )  4u},
   { (uint8_t ) 2u, 3u, (uint16_t )  4u},
   { (uint8_t ) 5u, 5u, (uint16_t ) 16u},
   { (uint8_t )10u, 1u, (uint16_t )  4u},
   { (uint8_t )11u, 2u, (uint16_t ) 32u},
   { (uint8_t )13u, 1u, (uint16_t )100u},
};
于 2015-08-06T12:35:22.640 に答える