こんにちは、NoMaYです。時折「アレッ?」と思うことはありました。CC-RXにはコンパイル時のワーニングレベルを上げるオプションが無いのだろうかと。別スレッドで少し前に、コンパイルオプションでインフォメーションメッセージを出すように設定すれば大抵のケアレスミスの類は引っ掛けてくれます、との投稿を目にしました。その時「ヤラレタ!」と思いました。(この仕様はどこの遺産なのだろう、、、)この際なので自分なりに確認してみました。CS+では以下の画面コピーのように設定すれば良いようです。コンパイル:リンク:試しに以下のソースをコンパイルしてみて幾つか新たなワーニングを検出させてみました。ccrx_show_info_msg.c
/* 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; }
========== リコンパイルの開始(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) ==========
リンク:
こんにちは、NoMaYです。これ以後、自分の作業ではワーニングレベルを上げることにしてコンパイルしていたので、今日まで明確に把握出来ていなかったのですが、CC-RXのデフォルト設定ではプロトタイプ宣言が無いことを検出してくれていないですね。(物忘れして、既に他のスレッドで書いていたかも知れませんが。) 大抵はそれでも動作するのですが、浮動小数点型の引数とか浮動小数点型の戻り値とかの場合は動作しなくなることも少なく無いので、注意が必要ですね。CC-RXのデフォルト設定では検出されないプロトタイプ宣言漏れに関するワーニング(ちなみにヘルプに記載が無いです)
M0520223:Function "XXX" declared implicitlyM0523077:Called function should have prototype
[関連リンク]ちなみに、デフォルト設定でプロトタイプ宣言が無いことを検出してくれないのはCC-RLもですね。(CC-RHは、試してみないと分からないですが、検出してくれない予感がします。)CS+やe2studioのコンパイル設定japan.renesasrulz.com/cafe_rene/f/forum21/6333/cs-e2studio/35087#35087「この時、”ワーニング”とか”警告”とかズバリのカテゴリ分けになっているコンパイラもあれば、オプションの全項目を片っ端から見ないとワーニングレベルを変更するものであることが分からないコンパイラもあります。ルネサスさんのコンパイラだと以下のような感じです。」