変数サイズミスで、終わらないforループをワーニングにしたい

初めまして、よろしくお願いします。

e2 studio で CCRL 1.09 を使用させていただいています。

変数サイズミスで終わらないforループをワーニングにする方法を教えて頂けないでしょうか。

・コンパイラの最適化はDebug優先です。

・forの後のコード(ret = 10;)を生成していないので、コンパイラは無限ループを認識していると思います。

・ワーニングが出ないと、全てのforループの変数長と、終了条件を目視チェックすることになるので、非常に厳しいです。

例:(1000までカウントする変数 count を、8ビットで定義してしまった)

void main(void) {
 unsigned char count;
 unsigned char ret;
 ret = 0;
 for(count = 0; count < 1000; count++){
  ret++;
 }
 ret = 10;
}

アセンブラ出力:

#CC-RL Compiler RL78 Assembler Source
#@  CC-RL Version : V1.09.00 [11 Nov 2019]
#@  Commmand :
#@   -cpu=S2
#@   -c
#@   -dev=C:\Renesas\e2_studio\DebugComp\\RL78\RL78\Common\DR5F1026A.DVF
#@   -I C:\Program Files (x86)\Renesas\RL78\1_9_0\inc
#@   -I C:\test\char_test\generate
#@   -character_set=utf8
#@   -lang=c
#@   -g
#@   -asm_path=src/
#@   -pass_source
#@   -Onothing
#@   -o src/char_test.obj
#@   ../src/char_test.c
#@  compiled at Tue Apr 21 08:55:06 2020

 .PUBLIC _main

 .SECTION .textf,TEXTF
_main:
 .STACK _main = 6
 ;***        1 :
 ;***        2 : void main(void)
 .LINE "C:/test/char_test/src/char_test.c", 2
 push hl
 ;***        3 : {
 ;***        4 :  unsigned char count;
 ;***        5 :  unsigned char ret;
 ;***        6 :  ret = 0;
 .LINE "C:/test/char_test/src/char_test.c", 6
 mov [sp+0x00], #0x00
.BB@LABEL@1_1: ; entry.split
 ;***        7 :  for(count = 0; count < 1000; count++){
 .LINE "C:/test/char_test/src/char_test.c", 7
 mov [sp+0x01], #0x00
 br $.BB@LABEL@1_3
.BB@LABEL@1_2: ; bb
 ;***        8 :   ret++;
 .LINE "C:/test/char_test/src/char_test.c", 8
 mov a, [sp+0x00]
 inc a
 mov [sp+0x00], a
 mov a, [sp+0x01]
 inc a
 mov [sp+0x01], a
.BB@LABEL@1_3: ; bb6
 .LINE "C:/test/char_test/src/char_test.c", 7
 br $.BB@LABEL@1_2
 ;***        9 :  }
 ;***       10 :  ret = 10;
 ;***       11 : }

 

よろしくお願いいたします。

Parents
  • komさん、こんにちは。NoMaYと申します。

    > 変数サイズミスで、終わらないforループ

    変数の型(uint8_t, unit16_t, uint32_t等)に応じた数値範囲の不整合の話なのですね。記憶では、(他のコンパイラですが)MISRA-Cチェックが(うっとおしいほど)ワーニングを出力していたように思います。CC-RLでもMISRA-Cチェックが出来たと思います(プロフェッショナル版のみだったと思いますが、無償版でも初めの内は試せると思います)ので、それを試してみる手もあるかと思います。(ただ、うっとうしいほど沢山のワーニングが出るのと、今回のが実際に検出されるかどうか不明なのと、そういった懸念はあります、、、)

    また、このたぐいの話ではlintというツールを使用するのが定番と思います。(Amazon FreeRTOSのGitHubでも、プルリクエストを出すときの文面テンプレートに、lintしたかどうかを示すチェックマークがあったりします。ただ、私は使ったことが無くて、どんなお勧めのフリーソフトがあるか分かってないです。) とは言え、今は昔ほどはlintの話を見掛けない気はします。(コンパイラのワーニングチェック能力が昔よりは全般的に向上したからかな、と思っていたります、、、)

Reply
  • komさん、こんにちは。NoMaYと申します。

    > 変数サイズミスで、終わらないforループ

    変数の型(uint8_t, unit16_t, uint32_t等)に応じた数値範囲の不整合の話なのですね。記憶では、(他のコンパイラですが)MISRA-Cチェックが(うっとおしいほど)ワーニングを出力していたように思います。CC-RLでもMISRA-Cチェックが出来たと思います(プロフェッショナル版のみだったと思いますが、無償版でも初めの内は試せると思います)ので、それを試してみる手もあるかと思います。(ただ、うっとうしいほど沢山のワーニングが出るのと、今回のが実際に検出されるかどうか不明なのと、そういった懸念はあります、、、)

    また、このたぐいの話ではlintというツールを使用するのが定番と思います。(Amazon FreeRTOSのGitHubでも、プルリクエストを出すときの文面テンプレートに、lintしたかどうかを示すチェックマークがあったりします。ただ、私は使ったことが無くて、どんなお勧めのフリーソフトがあるか分かってないです。) とは言え、今は昔ほどはlintの話を見掛けない気はします。(コンパイラのワーニングチェック能力が昔よりは全般的に向上したからかな、と思っていたります、、、)

Children
  • NoMaY さん
    教えて頂きましてありがとうございます。

    残念ながら、CC-RLは30日以上過ぎています。
    (レジストリの情報削除はしません)

    短時間では使えそうな lint を見つけられませんでしたが、
    これからじっくり探してみます。

    今後ともよろしくお願いいたします。