未使用変数,関数がある場合に warningメッセージを表示することは可能でしょうか?ご教示いただけますと幸いです。
【環境】IDE CS+ビルド・ツール CC-RL
staticなシンボルについてはコンパイル時に参照されていないことをwarningで知ることはできます。globalな関数や変数は、参照されるかどうかコンパイル時には分からないのでコンパイルの段階で警告は出せませんが、リンク時にリンカ最適化(symbol_delete有効時)により参照されない関数や変数が消されるので何が消えたかをmapファイルで確認することは可能です。(シンボル情報の出力を有効にしておく必要があります…
ほや さん、こんにちは。onotさんも、こんにちは。NoMaYです。ほやさん、どうも指摘ありがとうございます、CC-RL V1.11で試してみて確かに以下のワーニングが出ましたね。(過去のバージョンでは出ていなかった筈、という意図の文面ではないです。) 失礼しました。例1:static int v;void main(void);void main(void){}⇒ W0520177:Variable…
ほやさん,NoMaYさんありがとうございます。
>globalな関数や変数は、参照されるかどうかコンパイル時には分からないのでコンパイルの段階で警告は出せません...なるほど(>_<)
下記の手順で,未使用なグローバル変数についても,ビルド時にコンソール表示できました。
■手順1. CC-RL(ビルド・ツール)を開く2. 「リンクオプション」タブをクリック3. メッセージ のなかから…
onotさん、こんにちは。NoMaYです。#お久しぶりです。以前に他の人にリプライしたスレッドがあるのですが、CC-RLでワーニングレベルを上げることが出来るのは以下の点に関してのみで、未使用変数や未使用関数に対してワーニングを出すようにすることは出来ないです。ちなみに、コンパイラ/リンカの最適化オプションには未使用変数や未使用関数をリンクしないというオプションがあるのと(ただし、完璧に未使用なものをリンクしないようになっているかと、ちょっと何とも言えない印象はありますが)、リンカのメッセージオプションで未使用変数や未使用関数を表示させるということが出来るようになっています。他方で、CC-RXやGCCやIARコンパイラでは、コンパイル時に、static変数やstatic関数に関しては、未使用変数や未使用関数に対してワーニングを出すようにすることが出来ますが、あくまでもstatic変数やstatic関数に関してであり、グローバル変数やグローバル関数に関してはワーニングを出すことは出来ないです。あと、コンパイラの最適化レベルの設定によって、CC-RLも含めてどのコンパイラでも、未使用のstatic変数や未使用のstatic関数はコンパイル時に最適化機能によって削除されるようにすることが出来ます。CS+やe2studioのコンパイル設定community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6333/cs-e2studio/35087#35087「●CC-RL自分が認識している範囲ですと -refs_without_declaration がこのカテゴリのものですね。(正確には、ワーニングにするかどうかでは無く、エラーにするかどうかの設定になりますけれども。) ヘルプでは、コンパイラ編→コマンドリファレンス→オプション→コンパイルオプション→機能拡張のグループ分けの下にあります。「宣言がない関数を呼び出す場合,または古いスタイル(K&R)の宣言が書かれた関数呼び出しをエラーとします。[指定形式]-refs_without_declaration- 省略時解釈 宣言がない関数を呼び出す場合,または古いスタイル(K&R)の宣言が書かれた関数を呼び出す場合にメッセージを出力しません。[詳細説明]- 宣言がない関数を呼び出す場合,または古いスタイル(K&R)の宣言が書かれた関数を呼び出す場合にエラーとします。」」[関連リンク]C言語の引数community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rl78/f/forum18/6433/c「その機能は、CC-RXにはありますが、CC-RL(とCC-RH)には無いのです。そして、CC-RXで検出されていても、今回は、RL78とCC-RLでのことなのです。この3種類のコンパイラは、必ずしも同一の仕様という訳ではなくて、C言語拡張仕様やコマンドラインオプションがそれなりにばらついています。そして、ワーニングレベルに関しては、CC-RXが最も高い設定が出来るような感じになってますね。」CC-RXの未使用の変数/関数を削除する最適化の効き目がGNURX/ICCRXより歴然と弱いのですが、、、community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6403/cc-rx-gnurx-iccrx「リンカにインフォメーションメッセージでunused symbolを表示させたところ、以下のようなdeleteされたシンボルのリストが表示されたのですが、それでもずっと沢山のunusedシンボルのリストが表示されました。直感的に、なぜunusedシンボルが残っているのか(deleteされていないのか)不思議な気がするのです、、、(その一方で、_Except_Vectorsや_Reset_Vectorがunusedになっているのも不思議ですが、、、)」
NoMaYさん
ありがとうございます。未使用変数や未使用関数に対して,ワーニング表示できないことを理解しました。
ソースコードをgccコンパイラに食わせるプランを試したいと思います。-Wallオプションをつければ,未使用変数があった場合にワーニングを出してくれるので。
また,教えていただいた「-refs_without_declaration」オプションを試しました。宣言が無い変数を呼び出すと,たしかにワーニングではなくエラーで知らせてくれますね。 プロジェクト・ツリー 「CC-RL(ビルド・ツール)」 「コンパイルオプション」タブ その他 「そのほかのオプション」に「-refs_without_declaration」を追記