2017-08-04 29 views
1

私はC++プロジェクトのソースコードの一部を静的に解析するためにCoverityを使用しています。私はこれがちょっと不思議な問題のように思えるかもしれませんが、Coverityがこのような問題を抱えている場合、このエラーが報告された根本的な理由を知りたいと思いました。それはエラーのフラグを保持して、私はこのエラーが実際には私のコーディングプラクティスを変更するものか、それとも本当に不必要なのかを知りたい。Coverity静的解析符号なし整数はChar(C++)

エラーそのフラグの例は次のとおり

unsigned int a; 
a = 5; 

コベリティは、これで問題があると言う:

「CID 101436(#1の1):暗黙的な整数変換(MISRA_CAST) MISRA-2004規則10.1違反:暗黙的に式の符号量を変更します。基底型char(8ビット、符号付き)を使用して5を符号なしで符号なし整数(32ビット、符号なし)に変換します。

上記の例では、5が符号なしのintであり、charではないことを現代のコンパイラは知っていませんか?これは本当に有効なエラーですか、コンパイル時にエラーが発生する可能性がありますか? エラーはできるだけ早く私が追加すると消えます。

unsigned int a; 
a = 5U; 

私はすべてのunsigned int型の後に「U」を指定しない場合、それは本当に問題ですか?

+2

いいえ、これは明らかに問題ではありません。なぜあなたはMISRAに従うのですか? –

+1

エラーは間違いありません。 '5'は最小の整数リテラルであるのでintであるのは間違ったイオンです。 'char'が保持できる有効範囲内にあることが知られているので、 'char'を問題なしに初期化するために' 5'を使うことは可能ですが、それは正しいです。 – NathanOliver

+0

署名付きタイプに関する警告を表示しない場合は、「U」を追加するか、Coverityのチェッカーを変更します(チェッカーを無効にする)。 –

答えて

2

定義上、接尾辞のない数値の整数定数は符号付き量です。定数をキャストするか、 'U'の接尾辞を追加する必要があります。

他の問題は、定数に値を含む最小の型が割り当てられることです。たとえば、int8_tまたはsigned charに5が入ります。ただし、signed charの場合は260が大きすぎるため、最小タイプはintです。

2つ目の警告は、署名の問題が解決された後に消えることがあります。

+0

Uサフィックスがなければ、コンパイラは5をcharと解釈しますか?それは、それが無署名のintに割り当てられていることを知っていなければならず、自動的にその型に解決されますか?現代のコンパイラが明らかにこの種の問題を持っていなければ、なぜこのMISRAルールが存在するのか不思議です。 – 9Breaker

+1

MISRA C-2004のコピーを入手し、「6.10.4基礎タイプ」セクションを参照する必要があります。答えにペーストするテキストが多すぎます。 –

+1

インターネットで「stackoverflow MISRA C」を検索することで、関連する問題を見つけることができます。 –

関連する問題