2017-05-22 3 views
5

だから、私はこのコードを持っています。Cで定数でなければならない変数を見つけるにはどうすればよいですか?構造のイーサネットパケットの先頭へのポインタを作成します</p> <pre><code>uint8_t* pbytes = pkt->iov[0].iov_base; </code></pre> <p>:

私は友人にコードを見て欲しいと言っています。彼は「あなたはそれを修正していませんし、そうした場合は本当に混乱します。

そして、これは非常に、良いアイデアのように思える:でも

const uint8_t* pbytes = pkt->iov[0].iov_base; 

か:

const uint8_t * const pbytes = pkt->iov[0].iov_base; 

そして今、私は考えていますが、私が行っている可能性が他の場所の負荷がある賭けますコンパイラが私よりもそれらを見つけ出す方が良いと確信しています。

どのように私はそれを質問する任意のアイデアですか? (gccが望ましいですが、UNIX上で動作する限り、別のコンパイラやlintingツールを使用しても問題はありません)。

+1

'のconst uint8_t * pbytes'は一定ではありません。 Cは_enum-constants_(常に 'int')以外の記号定数を持っていません!それはC++ではありません。 – Olaf

+0

これを簡単に自動化する方法はありません。 'const'をすべて宣言してから、エラーになる変数を削除することができます。 – Barmar

+1

2番目の 'const'は' * 'の後に続く必要があります。 'const uint8_t * const pbytes = ...; '' pbytes'をconst 'uint8_t'へのconstポインタとして定義します。 –

答えて

-2

const propagates。実際、それはしばしば問題となり、「コンポイズニング」と呼ばれます。問題はstrchr()のような関数で、constポインタか変数で呼び出すことができます。しかし、const *を返すと、文字列はポインタで変更することはできません。これはしばしばあなたがしたいことです。

しかし、定数データを読み込んだ/初期化した直後に定数を作成すると、const修飾されていないコンテキストに渡そうとするたびに、コンパイラがエラーをスローします。 [フォーマット| CONST | | noreturn純粋]属性を追加することは有益であり得る場合について警告

+1

'strchr'は' const'-正しさに違反することができ、標準ライブラリ関数の一握りの一つです。これは 'const'の根本的な問題を意味しません。 –

+0

確かに問題はむしろ、Cの標準ライブラリはstrchrのような古くて重苦しく書かれた関数がたくさんあることです。この標準的なライブラリの欠点は、他の場所では駄目なコードを書こうとする言い訳ではありません。 – Lundin

4

GCCはCONST

-Wsuggest属性のよう=を有益な属性を提案するフラグを有します。現在サポートされている属性は です。

-Wsuggest属性=
純粋-Wsuggest属性= constの
-Wsuggest-属性は= noreturn
は、属性、純粋な、CONSTまたはnoreturnの候補となりそうな関数について警告します。コンパイラのみ は、関数が を正常に返すことを証明できない場合は、他のコンパイル単位(または純粋なものとconstの の場合)に表示される関数を警告します。 の無限ループが含まれていない場合、または異常終了した場合は呼び出しを中止または トラップによって異常に戻った場合、関数は正常に戻ります。この解析には、オプション-fipa-pure-constが必要です。これは、デフォルトで-Oで有効にされた です。高い最適化レベル は分析の精度を向上させます。

のSrc:http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

+0

残念ながら、それは関数にのみ適用されるようです。 –