2016-04-27 22 views
1

ISO C標準(6.3.16.1)によれば、「両方のオペランドが両方とも互換性のある型のポインターであり、左に指されている型は、右に指されている型のすべての修飾子を持っています。 私は静的解析ツールでその警告を受けましたが、実際の問題があるかどうかはわかりません。あなたは以下のコードで見ることができるように、そのポインタはそれのプロトタイプ危険なキャストキャストの結果、const資格が失われる

int main() 
{ 
    static volatile const signed int batu[5] = {1,2,3,4,5}; 
    unsigned int x = 5; 
    func(x, (signed int *) batu); 
} 

signed int func(unsigned int p1, volatile const signed int *p2) 
{ 
    return 0; 
} 
+0

セクションに「6.3.16」はなく、標準では「.1」はありません。これまでリファレンスとして使用してきたものはISO9899ではありません。 – Olaf

+0

1)絶対に必要なものではない、2)キャストの**すべての**意味を理解していない、または3)完全に受け入れていない場合、キャストを使用しないでください。だから、**なぜ**あなたはそのキャストを使用していますか? – Olaf

+0

セクション '6.5.16.1/1'(C99) – atturri

答えて

1

に「CONST」修飾子を持つ関数に渡されますので、あなたはちょうどあなたが関数への呼び出しで持って(signed int *)キャストを削除する必要があります。変数batuと関数で期待される引数p2は、同じ型(以下参照)の修飾子が含まれているので、キャストはまったく必要ありません。

配列タイプは、sizeofまたはユニキャスト&オペレータへの入力の場合を除いて、常に自動的に同等のポインタタイプに変換されます。 C標準6.3.2.1/3より。

+0

あなたは大丈夫ですが、このコードはmatlabによって生成され、手動で変更することは推奨されていません。実際には、そのエラーが本物であるかどうかを理解しようとしています – batgun

+2

@batgun:そのエラーは本当に重要です。そして、IMHOは、不要な(潜在的に)危険なキャストを生成するツールをできるだけ早急に削除する必要があります。これは、広く使用されているツールではさらに真実です。 – Olaf

+0

@batgunこの特定のケースでは、関連するコードを削除していない場合は、誤った警告です。しかし、コードが他の目的のために削除された 'volatile 'ポインタを使用すると、潜在的に有害な可能性があります。 – user694733

関連する問題