変数サイズミスで、終わらない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
  • > 変数サイズミスで終わらないforループをワーニングにする方法

    ・gcc(https://gcc-renesas.com/ja/rl78/rl78-download-toolchains/)でコンパイルしてみる
    ・CC-RL 改善のリクエストをルネサスに執拗に送る
    ・ループの書き方を変更する for(count = 1000; count > 0; count--){

    ぱっと思いつくのはこの辺りですね。

  • fujita nozomu さん、返信ありがとうございました。

    コンパイラを変えるのは他のプロジェクトの関係で難しいのと、
    ループの書き方はバッファ処理の時などは難しいので、
    当面はCC-RL改善リクエストの窓口を探して、リクエストしてみます。
    また、それと並行して、gccでコンパイルだけ流して、エラーチェックだけする方法も検討してみます。

    CC-RLに関しては、下記も追加でリクエストしてみます。
    ・#if でタイプミスによる未定義シンボルが、無条件で「#if 0」とみなされる。
     (「インフォメーション、ワーニング…をエラーに変更する」に20193を指定してエラーにする)
    ・farポインタ比較が、無条件で下位16ビット比較になり、
     比較対象によっては if() の後が無条件実行/非実行になる。(if(ptr >= 0xf0000) ... など)
     (ポインタ比較は必ずlongにキャストするように、「ユーザーが」注意する)

    大変参考になりました。
    今後ともよろしくお願いします。
  • fujita nozomu さん

    教えて頂きまして有難うございました。

    残念ながら、RL用のGCCの"-Wall"オプションを付けても、何も出ませんでした。
    #if 未定義シンボル」も引っ掛かりませんでした。

    販売代理店経由でリクエストを出してみます。
    今後ともよろしくお願いします。
  • fujita nozomu さん

    gccで "-Wextra" オプション追加で、「warning: comparison is always true....」が出ました。
    通常のビルドは CC-RL で行い、時々チェックの為に gcc でもビルドするようにします。

    大変助かりました。
    有難うございました。
Reply
  • fujita nozomu さん

    gccで "-Wextra" オプション追加で、「warning: comparison is always true....」が出ました。
    通常のビルドは CC-RL で行い、時々チェックの為に gcc でもビルドするようにします。

    大変助かりました。
    有難うございました。
Children
  • komさん
    横から失礼します。
    私も同様なことで悩んでいます。
    私も同様に時々gccでビルドするようにしたいと思っています。
    しかし、gccでビルドするには、まともにgcc用の新規プロジェクトを別途作って、ccrlのコードをコピペして行うのでしょうか?
    どこかの設定で簡単に切り替えてコンパイルができるのでしょうか?
  • ega258さん
    ほや です。こんにちは。

    e² studioのプロジェクトインポート機能にCC-RLからGCCプロジェクトへの変換(コンバータ)はないので、
    GCCのプロジェクトを新規で作成するしかありません。

    CC-RLのプロジェクトとしてインポートしたものを「Tool chainエディター」で
    toolchainだけGCCに変更しようとしてもまずうまく行かないので御注意。

    文法チェックだけが目的ならリンクまで通す必要はないので難しくないと思います。

  • ほやさん、ega258さん
    komです。こんにちは。

    色々と有難うございます。

    終わらないループが有る事を知りたいだけでしたので、
    gccでコンパイルだけ(リンクとビルドは不要)できるプロジェクトを作成して、
    大きな修正後にソースコード一式をコピペで置き換えて、ビルドしています。

    これで、"#if 未定義シンボル"と"256回以上のループ変数をcharに間違えて終わらない"を
    見つけられるので、私の用途には十分です。


    今後ともよろしくお願いします。
  • > 大きな修正後にソースコード一式をコピペで置き換えて、ビルドしています。

    e² studio上でソースファイルを別のプロジェクトにドラッグ&ドロップし、その際に「コピー」でなく「リンク」を選ぶと、ソースファイルを毎回コピーし直さずに済みます。