3

LINT を使用して、自動生成された C ソースファイルをチェックしています。これらのソースファイルでは、これらのマクロが使用されています (簡略化):

#define MACRO_CHECK(a, b, c) \ 
   ((a==b) ? b : (SET_VAR, c))

#define SET_VAR \
   global_var = 0 \

コードでは、これらのマクロは次のように使用されます。

if ( (x==0) && (MACRO(var1,var2,var3)==0) )
{
    //...
}

私の LINT 分析では、次のメッセージが表示されます。

LINT Note 9007: side effects on right hand of logical operator

私のマクロはグローバル変数に値を書き込んでいるので、LINT メッセージ自体は正当化されます。ただし、アーキテクチャ上の理由により、このメッセージを無視できることはわかっています。このため、メモ 9007 のチェックからマクロを除外したいと考えています。自動コード生成を使用しているため、LINT を挿入するのに苦労しています。コメント (Lint メッセージを無効にするため) をソース ファイルの適切な場所に挿入します。よりクリーンなアプローチは、LINT-Ruleset のチェックからマクロを除外することです。そこで、次の行を LINT ルールセットに追加しようとしました。

-emacro((9007),MACRO_CHECK) 

ただし、マクロ自体のコードはチェックから除外されますが、論理演算子は含まれていない&&ため、注 9007 が表示されるため、これはうまくいきません。エラーを無効にする方法はありますか?私のマクロに何らかの形で関連するすべてのメッセージに対して?

4

1 に答える 1

2

使用する必要があります

--emacro((9007),MACRO_CHECK)

と の違いに注意してください-emacro( --emacroPC-Lint マニュアルから引用):

-emacro( (#), symbol, ... ) は、マクロ式に対して、

--emacro( (#), symbol, ... ) は、式全体で、指定された各マクロ シンボルのメッセージ # を抑制します。マクロは (構文的に) 式であることが期待されます。

そのため、たいていの場合、この追加-は希望どおりに機能しますが、抑制したくないマクロが使用されている行のメッセージを抑制してしまう可能性があるため、注意が必要です。

次の点を考慮してください。

if ( (x==0) && (MACRO_CHECK(var1,var2,var3)==0) && ((01234) == 0x1234) )
{
    //...
}

私の構成(MISRAチェックを使用するPC-Lint 9.00j)では、これは私を(他の多くのものの間に)出力します:

注 [1960]: MISRA C++ 2008 Required Rule 5-14-1 に違反し、論理演算子 '&&' の右側に副作用があります

注[1960]: MISRA C++ 2008 Required Rule 2-13-2 に違反、8 進定数を使用

01234もちろん、2番目の犯人です。指摘されているように、マクロの Note 1960 を無効にすると、次のようになります。

//lint --emacro((1960),MACRO_CHECK)

両方のメッセージがなくなりましたが、この場合は望ましくありません。

于 2015-01-27T13:28:41.217 に答える