未使用変数・関数がある場合にwarningメッセージを表示させたい

未使用変数,関数がある場合に warningメッセージを表示することは可能でしょうか?
ご教示いただけますと幸いです。

【環境】
IDE CS+
ビルド・ツール CC-RL

Top Replies

  • 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」を追記

  • staticなシンボルについてはコンパイル時に参照されていないことをwarningで知ることはできます。
    globalな関数や変数は、参照されるかどうかコンパイル時には分からないのでコンパイルの段階で警告は出せませんが、
    リンク時にリンカ最適化(symbol_delete有効時)により参照されない関数や変数が消されるので何が消えたかをmapファイルで確認することは可能です。
    (シンボル情報の出力を有効にしておく必要があります)
    リンカのinformationレベルメッセージ出力を有効にしておけばコンソールにも表示できます。

    コンパイル時に-goptimizeが付いていないかリンカの最適化を無効にすると、参照されない関数/変数を誰もチェックしないので何が参照されなかったかはどこにも出力されません。

  • ほや さん、こんにちは。onotさんも、こんにちは。NoMaYです。

    ほやさん、どうも指摘ありがとうございます、CC-RL V1.11で試してみて確かに以下のワーニングが出ましたね。(過去のバージョンでは出ていなかった筈、という意図の文面ではないです。) 失礼しました。

    例1:

    static int v;

    void main(void);
    void main(void)
    {
    }

    ⇒ W0520177:Variable "v" was declared but never referenced

    例2:

    static int v;

    static int f(void)
    {
        return v;
    }

    void main(void);
    void main(void)
    {
    }

    ⇒ W0520177:Function "f" was declared but never referenced

    [追記]

    メッセージが英語になっているのは私の開発環境の設定によるもので、デフォルト設定では日本語だった筈です。

  • ほやさん,NoMaYさん
    ありがとうございます。

    >globalな関数や変数は、参照されるかどうかコンパイル時には分からないのでコンパイルの段階で警告は出せません
    ...なるほど(>_<)

    下記の手順で,
    未使用なグローバル変数についても,ビルド時にコンソール表示できました。

    ■手順
    1. CC-RL(ビルド・ツール)を開く
    2. 「リンクオプション」タブをクリック
    3. メッセージ のなかから,次を「はい」にする。
    「インフォメーション・メッセージ出力を有効にする」
    「参照されない定義シンボルを通知する」

    4. ビルドする

    ■サンプルコード
    ---------- r_main.c ----------
    int32_t hoge; //グローバル変数

    int main(void)
    {
    :

    :
    }
    ------------------------------

    ■ビルド実行

    ビルドを実行すると 「hoge」 は使われていないよ,とメッセージが出てきますね。

    M0560400:Unused symbol "DefaultBuild\r_main.obj"-"_R_MAIN_UserInit"
    M0560400:Unused symbol "DefaultBuild\r_main.obj"-"_hoge"
    M0560400:Unused symbol "DefaultBuild\r_cg_wdt.obj"-"_R_WDT_Restart"
    M0560400:Unused symbol "rlink_generates_04"-"__s.vect"
    M0560400:Unused symbol "rlink_generates_04"-"__s.constf"
    M0560400:Unused symbol "rlink_generates_04"-"__e.constf"
    M0560400:Unused symbol "rlink_generates_04"-"__s.data"
    M0560400:Unused symbol "rlink_generates_04"-"__e.data"
    M0560400:Unused symbol "rlink_generates_04"-"__s.sdata"
    M0560400:Unused symbol "rlink_generates_04"-"__e.sdata"
    M0560400:Unused symbol "rlink_generates_04"-"__e.vect"
    M0560400:Unused symbol "rlink_generates_04"-"__s.option_byte"
    M0560400:Unused symbol "rlink_generates_04"-"__s.RLIB"
    M0560400:Unused symbol "rlink_generates_04"-"__e.RLIB"
    M0560400:Unused symbol "rlink_generates_04"-"__s.SLIB"