Menu

free()の引数への警告

Anonymous
2012-09-26
2012-10-22
  • Anonymous

    Anonymous - 2012-09-26

    関数free()とrealloc()の引数では,W9003 の警告を抑止してはいかがでしょうか.
    例えば下記のコードで

    W9003,暗黙的に `struct DATA *' 型のオブジェクトが異なる型のオブジェクトに変換されています。
    

    という警告が出ます.

    #include <stdlib.h>
    
    typedef struct DATA Data;
    
    void sample(Data *data)
    {
      free(data);
      return;
    }
    

    この場合,ポインタを明示的に (void *) にキャストすることに保守性などの効能があるようには思えません.free()の引数では,特別にこの警告を出さない方が良い気がします.

    また,この警告の出し方についての話ですが,typedef した型名でメッセージを出力した方が適切な気がします.例えば上の例に従うなら

    W9003,暗黙的に `Data *' 型のオブジェクトが異なる型のオブジェクトに変換されています。
    

    のように.

     
    • Yutaka Yanoh

      Yutaka Yanoh - 2012-10-22

      ご報告ありがとうございます。

      申し訳ありません。AdLint の不具合です。
      たしかに、ご指摘の通り任意の型へのポインタを void * に変換することは自然なため、警告の必要はありません。

      原因を調査したところ、サンプルコードのように関数の仮引数としてのポインタを void * に変換する場合のみ再現することがわかりました。
      本件の修正を AdLint 2.6.0 に盛り込み、本日リリースいたしました。

      また、後半の typedef 名による型名表示についても AdLint 2.6.0 にて対応いたしました。
      しかも大変ありがたいことに、警告メッセージとメトリック (*.c.met.csv に出力する内容) を共通して typedef 名とすることにより、W0770 などのクロスモジュール解析でチェックする項目にあった仕様不具合も修正することができました。
      本当にありがとうございます。

      お手数おかけしますが、AdLint 2.6.0 にアップデートしていただき、再度ご確認をお願いいたします。

       

Log in to post a comment.