CC-RXでWarning Levelを上げるOptionはインフォメーションメッセージ出力オプションだと知ったので試してみました

こんにちは、NoMaYです。

時折「アレッ?」と思うことはありました。CC-RXにはコンパイル時のワーニングレベルを上げるオプションが無いのだろうかと。別スレッドで少し前に、コンパイルオプションでインフォメーションメッセージを出すように設定すれば大抵のケアレスミスの類は引っ掛けてくれます、との投稿を目にしました。その時「ヤラレタ!」と思いました。(この仕様はどこの遺産なのだろう、、、)

この際なので自分なりに確認してみました。CS+では以下の画面コピーのように設定すれば良いようです。

コンパイル:




リンク:


試しに以下のソースをコンパイルしてみて幾つか新たなワーニングを検出させてみました。

ccrx_show_info_msg.c

4747.ccrx_show_info_msg.c.txt
/* Increase CC-RX warning level by using -message option
 * See JapanRenesasRulz post : https://japan.renesasrulz.com/cafe_rene/f/forum5/4421/thread/23330#23330
 */

/* /* nested comment */

int func(int, int, int, int);

volatile void sub1(int);
volatile int sub2(int);

volatile static int var = 1;;

/* See FIT BSP source files : r_bsp\board\XXXX\lowsrc.c, r_bsp\mcu\YYYY\mcu_interrupts.c
 * See also JapanRenesasRulz post : https://japan.renesasrulz.com/cafe_rene/f/forum5/4059/sci/20672#20672
 */
/* This macro is used to suppress compiler messages about a parameter not being used in a function. The nice thing
 * about using this implementation is that it does not take any extra RAM or ROM.
 */
#define INTERNAL_NOT_USED(p)        ((void)(p))

int func(int arg1, int arg2, int arg3, int arg4)
{
    unsigned char ch;

    arg1;
    INTERNAL_NOT_USED(arg2);
#if INTERNAL_NOT_USED
    INTERNAL_NOT_USED(arg3);
#endif  /* INTERNAL_NOT_USED */

    sub1(ch);
    ch = sub2(arg4);

    while (1) { volatile unsigned char ch; }
    while (1) {}

    return ch;
}


compile.log

7870.compile.log.utf8.txt
========== リコンパイルの開始(2017年7月19日 16:39:43) ==========
------ ビルド開始(user_app_not_with_toppers, DefaultBuild) ------
>..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(5):M0520009:Nested comment is not allowed
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(9):M0520815:Type qualifier on return type is meaningless
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(10):W0520815:Type qualifier on return type is meaningless
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(12):M0520082:Storage class is not first
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(12):M0520381:Extra ";" ignored
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(26):M0520174:Expression has no effect
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(28):M0520193:Zero used for undefined preprocessing identifier "INTERNAL_NOT_USED"
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(32):M0523034:Conversion in argument
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(32):M0520549:Variable "ch" is used before its value is set
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(33):M0523033:Precision lost
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(35):M0521348:Declaration hides variable "ch" (declared at line 24)
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(36):M0520128:Loop is not reachable from preceding code
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(38):M0520111:Statement is unreachable
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(38):M0523035:Conversion in return
..\..\sample\toppers_r_usb_pcdc_echo_apl\ccrx_show_info_msg.c(22):M0520826:Parameter "arg3" was never referenced
------ ビルド終了(エラー:0個, 警告:1個)(user_app_not_with_toppers, DefaultBuild) ------
========== 終了しました(成功:1プロジェクト, 失敗:0プロジェクト)(2017年7月19日 16:39:49) ==========


ヘルプによると新たに検出されるようになるワーニングは以下の通りとなっていましたが、上のソースでは、M0520082やM0523034やM0523035が検出されているものの未記載でしたし、M0520815は僅かな違いで通常レベルのワーニングとして検出されるケースもあるようでした。

インフォメーション - CS+ V5.00 オンラインヘルプ > コンパイラ編 > メッセージ > メッセージ

コンパイル:  (以下ではC++特有と思われものは薄灰色にしてみました。)

M0520009 [メッセージ] Nested comment is not allowed.
[説明] コメントのネスティングは許されていません。
M0520018 [メッセージ] Expected a ")".
[説明] ")" がありません。
M0520111 [メッセージ] Statement is unreachable.
[説明] 文は実行されません。
M0520128 [メッセージ] Loop is not reachable from preceding code.
[説明] ループはその前のコードから到達しません。
M0520174 [メッセージ] Expression has no effect.
[説明] 式は作用しません。
M0520193 [メッセージ] Zero used for undefined preprocessing identifier xxx.
[説明] 定義されていないプリプロセッサ識別子xxxに対して0が使用されます。
M0520237 [メッセージ] Selector expression is constant.
[説明] 選択式が定数です。
M0520261 [メッセージ] Access control not specified ("名前" by default).
[説明] 基底クラスのアクセス制御指定がありません。アクセス制御指定"名前"が仮定されます。
M0520324 [メッセージ] Duplicate friend declaration.
[説明] フレンド宣言が重複して指定されています。
M0520381 [メッセージ] Extra ";" ignored.
[説明] 余分な ";" を無視しました。
M0520399 [メッセージ] 名前 has an operator new xxx() but no default operator delete xxx().
[説明] "名前"がoperator new を持ちますが、デフォルトのoperator delete を持ちません。
M0520400 [メッセージ] 名前 has a default operator delete xxx() but no operator new xxx().
[説明] "名前"がデフォルトのoperator delete を持ちますが、operator new を持ちません。
M0520479 [メッセージ] 名前 redeclared "inline" after being called.
[説明] 関数が呼ばれたあとにinline"名前"を宣言しています。以降inline 指定を有効にします。
M0520487 [メッセージ] Inline 名前 cannot be explicitly instantiated.
[説明] インライン関数"名前"を実体化することはできません。
M0520534 [メッセージ] Use of a local type to specify an exception.
[説明] ローカルな型を使用した例外処理が指定されています。
M0520535 [メッセージ] Redundant type in exception specification.
[説明] 例外処理中に冗長な型の指定があります。
M0520549 [メッセージ] symbol is used before its value is set.
[説明] symbol は値が設定される前に使用されました。
M0520618 [メッセージ] Struct or union declares no named members.
[説明] 構造体か共用体に名前のないメンバがあります。
M0520652 [メッセージ] Calling convention is ignored for this type.
[説明] この型に対する呼び出し規約は無視されます。
M0520678 [メッセージ] Call of "symbol" cannot be inlined.
[説明] symbol の呼び出しはインライン展開できません。
M0520679 [メッセージ] symbol cannot be inlined.
[説明] symbol はインライン展開できません。
M0520815 [メッセージ] Type qualifier on return type is meaningless.
[説明] 返却型に対する型指定は意味がありません。
M0520831 [メッセージ] Support for placement delete is disabled.
[説明] operator delete 関数の型が正しくありません。処理を継続します。
M0520863 [メッセージ] Effect of this "#pragma pack" directive is local to xxx.
[説明] #pragma pack ディレクティブの影響はシンボル内にとどまります。
M0520866 [メッセージ] Exception specification ignored.
[説明] 例外指定は無視されます。
M0520949 [メッセージ] Specifying a default argument on this declaration is nonstandard.
[説明] この宣言にデフォルト引数を指定するのは標準形式ではありません。
M0521348 [メッセージ] Declaration hides "symbol".
[説明] 宣言は "symbol" を隠します。
M0521353 [メッセージ] シンボル has no corresponding member operator delete xxx (to be called if an exception is thrown during initialization of an allocated object).
[説明] "シンボル"はnew オペレータの対となるdelete オペレータを持ちません(取得したオブジェクトの初期化時に例外が発生した場合に呼ばれます)。
M0521380 [メッセージ] Virtual xxx was not defined (and cannot be defined elsewhere because it is a member of an unnamed namespace).
[説明] 仮想関数の定義がありません。また、無名空間のメンバであるため、それ以外の場所で定義することができません。
M0521381 [メッセージ] Carriage return character in source line outside of comment or character/string literal.
[説明] 改行文字がコメントまたは文字列リテラル以外のところにあります。
M0523009 [メッセージ] This pragma has no effect.
[説明] この#pragma は無効です。
M0523028 [メッセージ] Rule ルール番号: 内容
[説明] MISRA-C:2004のルール番号と内容の該当箇所を検出しました。
M0523033 [メッセージ] Precision lost.
[説明] 代入式において、右辺の式の値を左辺の型へ変換する時に、精度が失われる可能性があります。
M0523086 [メッセージ] Rule ルール番号: 内容
[説明] MISRA-C:2012のルール番号と内容の該当箇所を検出しました。

リンク:

M0560001 [メッセージ] Section "セクション" created by optimization "最適化"
[説明] "最適化"の最適化によって、"セクション"を作成しました。
M0560002 [メッセージ] Symbol "シンボル" created by optimization "最適化"
[説明] "最適化"の最適化によって、"シンボル"を作成しました。
M0560004 [メッセージ] "ファイル"-"シンボル" deleted by optimization
[説明] symbol_deleteの最適化によって、"ファイル"内の"シンボル"を削除しました。
M0560005 [メッセージ] The offset value from the symbol location has been changed by optimization : "ファイル"-"セクション"-"シンボル + offset"
[説明] "シンボル + offset"の範囲で最適化によるサイズ変更があったためoffset値を変更しました。問題ないか確認してください。offset値の変更を抑止したい場合は、"ファイル"のアセンブル時にgoptimizeオプション指定を外してください。
M0560100 [メッセージ] No inter-module optimization information in "ファイル"
[説明] "ファイル"内にモジュール間最適化情報がありません。"ファイル"をモジュール間最適化の対象外にします。モジュール間最適化の対象にする場合は、コンパイル、アセンブル時にgoptimizeオプションを指定してください。
M0560101 [メッセージ] No stack information in "ファイル"
[説明] "ファイル"内にスタック情報がありません。"ファイル"はアセンブラ出力ファイルの可能性があります。リンカが出力するスタック情報ファイルに当該ファイルの内容は含まれません。
M0560102 [メッセージ] Stack size "サイズ" specified to the undefined symbol "シンボル" in "ファイル"
[説明] "ファイル"内の未定義シンボル"シンボル"に、スタックサイズ "サイズ" が指定されています。
M0560103 [メッセージ] Multiple stack sizes specified to the symbol "シンボル"
[説明] シンボル"シンボル"は、複数のスタックサイズが指定されています。
M0560300 [メッセージ] Mode type "モード種別1" in "ファイル" differ from "モード種別2"
[説明] 異なるモード種別のファイルを入力しました。
M0560400 [メッセージ] Unused symbol "ファイル"-"シンボル"
[説明] "ファイル"内の"シンボル"は使用されていません。
M0560500 [メッセージ] Generated CRC code at "アドレス"
[説明] "アドレス"にCRCコードを出力しました。
M0560510 [メッセージ] Section "セクション" was moved other area specified in option "cpu=<メモリ属性>”
[説明] セクションを分割せずにcpu=<メモリ属性>にしたがって"セクション"を配置しました。
M0560511 [メッセージ] Sections "セクション名","分割後のセクション名" are Non-contiguous
[説明] "セクション名"のセクションを分割し、"分割後のセクション名"のセクションを生成しました。
M0560512 [メッセージ] Section "セクション" created by "オプション"
[説明] "オプション"によって、"セクション"を作成しました。
  • こんにちは、NoMaYです。

    これ以後、自分の作業ではワーニングレベルを上げることにしてコンパイルしていたので、今日まで明確に把握出来ていなかったのですが、CC-RXのデフォルト設定ではプロトタイプ宣言が無いことを検出してくれていないですね。(物忘れして、既に他のスレッドで書いていたかも知れませんが。) 大抵はそれでも動作するのですが、浮動小数点型の引数とか浮動小数点型の戻り値とかの場合は動作しなくなることも少なく無いので、注意が必要ですね。

    CC-RXのデフォルト設定では検出されないプロトタイプ宣言漏れに関するワーニング(ちなみにヘルプに記載が無いです)

    M0520223:Function "XXX" declared implicitly
    M0523077:Called function should have prototype

    [関連リンク]

    ちなみに、デフォルト設定でプロトタイプ宣言が無いことを検出してくれないのはCC-RLもですね。(CC-RHは、試してみないと分からないですが、検出してくれない予感がします。)

    CS+やe2studioのコンパイル設定
    japan.renesasrulz.com/cafe_rene/f/forum21/6333/cs-e2studio/35087#35087

    この時、”ワーニング”とか”警告”とかズバリのカテゴリ分けになっているコンパイラもあれば、オプションの全項目を片っ端から見ないとワーニングレベルを変更するものであることが分からないコンパイラもあります。ルネサスさんのコンパイラだと以下のような感じです。