1

次のオプションで PC-Lint 8.00x を使用しています。

+v -wlib(1) +fan +fas

次のようなコードを実行すると、PC-Lint から多数のエラー メッセージが表示されます。

typedef union
{
    struct
    {
        unsigned int a : 4;
        unsigned int b : 4;
        unsigned int c : 4;
        unsigned int d : 4;
    } bits;
    unsigned short value;
} My_Value;

int main (void)
{
    My_Value test[] =
    {
        {
            .bits.a = 2,
            .bits.b = 3,    //Errors 133 and 10
            .bits.c = 2,
            .bits.d = 3,
        },
        {
            .bits.a = 1,
            .bits.b = 1,    //Errors 133 and 10
            .bits.c = 1,
            .bits.d = 0,
        },
    };

    /* Do something meaningful. */

    return 0;
}

報告されたエラーは、PC-Lint によって次のように定義されています。

エラー 133: 集合体 'unknown-name' の初期化子が多すぎます

エラー 10: '}' が必要です

Gimpel を検索してみたり、Google で検索したりしましたが、役に立つものは見つかりませんでした。コードは意図したとおりに機能し、すべてが適切に初期化されます。これが私の質問です。

1. PC-Lint 8.00x は構造体メンバーの C99 スタイルの初期化をサポートしていますか?

2. その場合、これらのメッセージをグローバルに抑制するには、PC-Lint にどのオプション/フラグを設定する必要がありますか?

EDIT
質問 2 に関してもっと詳しく説明する必要がありました。上記の指定イニシャライザの使用に関して、これらのメッセージをグローバルに抑制したいと思います。これらのエラーはコード内の真のエラーを検出できるため、すべての状況でそれらをグローバルに抑制することはできません。

4

2 に答える 2

2

私が知る限り、この構文は次のとおりです。

My_Value test[] =
{
    {
        .bits.a = 2,
        .bits.b = 3,
        .bits.c = 2,
        .bits.d = 3,
    },
    {
        .bits.a = 1,
        .bits.b = 1,
        .bits.c = 1,
        .bits.d = 0,
    },
};

C99 (および C11) で有効です。標準のセクション 6.7.8 を見ると=、初期化子の の前にあるのはdesignator-listで、1 つ以上のdesignatorのシーケンスです。.bits.aその文脈で有効です。

どうやら PC-Lint はその構文をサポートしていないようです。(新しいバージョンで既にサポートされていない限り、メンテナに通知することをお勧めします。)

回避策として、これを次のように変更すると:

My_Value test[] =
{   
    { .bits =
        {   
            .a = 2,
            .b = 3,
            .c = 2,
            .d = 3,
        },
    },
    { .bits =
        {   
            .a = 1,
            .b = 1,
            .c = 1,
            .d = 0,
        },
    },
};

それはまだ有効な C (そしておそらくより明確) であり、あなたがコメントに書いたことに基づいて、PC-Lint はそれを受け入れます。

(さらに明確にしたい場合は、[0] =および[1] =指定子を追加することを検討してください。)

更新:新しいコメントを引用:

Gimpel ソフトウェアの善良な人々は、「これはバグのようです」と述べ、修正に取り組んでいます。

于 2014-07-10T00:02:51.220 に答える
2

私は 9.00k をインストールしているので、C99 と 8.00x のサポートに関する質問は不明です。しかし、9.00k はユニオンの初期化の形式を嫌いますが、Visual Studio には問題はありません。

しかし、Jacchim Pileborg の場合は、Info 708: union initializationオフにする方が安全かもしれません。

コメントに記載されているように、これらのエラー タイプを完全にグローバルに削除したくないため、問題は解決-e133-e10ません。

したがって、ヨアヒムのフォームを使用すると、マクロを使用して次のように抑制できます。

typedef union
{
    struct
    {
        unsigned int a : 4;
        unsigned int b : 4;
        unsigned int c : 4;
        unsigned int d : 4;
    } bits;
    unsigned short value;
} My_Value;

#define MY_UNION(A,B,C,D) /*lint -save -e708*/{{.a=(A),.b=(B),.c=(C),.d=(D)}}/*lint -restore*/

int main(void)
{
    My_Value test[] =
    {
        MY_UNION(2, 3, 2, 1),
        MY_UNION(1, 2, 3, 4)
    };

    return 0;
}

醜いですが、lint コマンドはすべて匿名であるため、固執するものがないため、明示的にまたはマクロを介してインライン コマンドを配置する必要があります。

于 2014-07-09T02:19:41.447 に答える