C言語の引数

RL78
CS+ forCC
でソフトを作っています。
例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。

メインで、
  uint16_t  aa;
  uint16_t  bb;
 
  aa = 1000;
  bb = 6000;
 xxfunc(aa, bb);
でコンパイルします。

引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。
暗黙の型変換だと思います。
このような場合でもワーニングを出すことはできますか?

Parents
  • 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.c
    Splint 3.0.1.6 --- 11 Feb 2002

    main.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: bb

    Finished 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.c
    Splint 3.0.1.6 --- 11 Feb 2002

    Finished checking --- no warnings

     

Reply
  • 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.c
    Splint 3.0.1.6 --- 11 Feb 2002

    main.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: bb

    Finished 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.c
    Splint 3.0.1.6 --- 11 Feb 2002

    Finished checking --- no warnings

     

Children
No Data