RL78CS+ forCCでソフトを作っています。例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。メインで、 uint16_t aa; uint16_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb);でコンパイルします。引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。暗黙の型変換だと思います。このような場合でもワーニングを出すことはできますか?
ega258さん、こんにちは。NoMaYです。試しに探してみたのですが、ソースコードが公開されているLintとして、以下の2つがありました。あくまで可能性のひとつですが、(1)そのまま試して警告が出るか?(2)出なければソースを修正する、という方策もあるかもと思うのです。(ちなみにLCLint/SPLintでは警告は出ませんでした。ADLintはRubyをインストールしないといけないようでしたのでちょっと億劫になってしまい試していません。もちろんソースを修正するということが簡単なことでは無いことは承知の上での、それでも可能性のひとつかも知れない、ということのものです。)・LCLint/SPLint (Cソース)sourceforge.net/projects/lclint/files/splint/3.0.1.6/lclint.cs.virginia.edu/guide/・ADLint (Rubyソース)sourceforge.net/projects/adlint/files/adlint/3.2.14/adlint.sourceforge.net/pmwiki/upload.d/Main/users_guide_ja.html[追記]LCLint/SPLintの実行例です。元がPC向けなせいかuint32_tもuint16_tもunsigned intみたいでしたので、ちょっと小細工しています。(LCLint/SPLintのソースというか定義ファイルを変更すれば小細工は不要になると考えています。)CASE1) このパターンは警告されるソース
typedef unsigned long ccrl_uint32_t;typedef unsigned short ccrl_uint16_t;void xxfunc(ccrl_uint16_t, ccrl_uint16_t);int main(void){ ccrl_uint32_t aa; ccrl_uint32_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb); return 0;}
結果
>set LARCH_PATH=../lib>splint main.cSplint 3.0.1.6 --- 11 Feb 2002main.c: (in function main)main.c(13,10): Function xxfunc expects arg 1 to be ccrl_uint16_t gets ccrl_uint32_t: aa Types are incompatible. (Use -type to inhibit warning)main.c(13,14): Function xxfunc expects arg 2 to be ccrl_uint16_t gets ccrl_uint32_t: bbFinished checking --- 2 code warnings
CASE2) このパターンは警告されないソース
typedef unsigned long ccrl_uint32_t;typedef unsigned short ccrl_uint16_t;void xxfunc(ccrl_uint32_t, ccrl_uint32_t);int main(void){ ccrl_uint16_t aa; ccrl_uint16_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb); return 0;}
>set LARCH_PATH=../lib>splint main.cSplint 3.0.1.6 --- 11 Feb 2002Finished checking --- no warnings