Menu

識別子の警告について

Anonymous
2012-09-16
2012-12-17
  • Anonymous

    Anonymous - 2012-09-16

    AdLintへの要望なのですが,警告 W0492 で識別子の衝突先がどこか分かるようにできるでしょうか.

    例えば AdLint 2.2.0 で下記のコードを解析にかけると

    #include <png.h>
    int member(void)
    {
      const int name = 0;
      return name;
    }
    

    下のように警告されます.

    W,../member.c,4,13,W0492,同じ識別子名 `name' が構造体/共用体のメンバの他に、ラベル、タグ、または通常の識別子としても使われています。
    

    ライブラリの構造体にメンバ名 name があるのですが,名前が一般的なので,警告が解析対象のプロジェクトに起因するのか使っているライブラリに起因するのか特定が難しいです.利用者ガイドを読むと,将来はプロジェクトのファイルに警告を限定する機能の予定があるようですが,このように原因の片方がプロジェクト外にある場合はどうなるでしょうか.

    しかしプロジェクト内でも,識別子が一文字など場合は探すのが難しいので,衝突が起きたファイルのパス名の情報があると助かります.

    (もし実現すると警告メッセージが長くなってしまうと思いますが,衝突先の特定を簡単にする出力内容で,かつ一行ごとに情報がまとまっている現在の利便性を損なわないような,他の良い出力方法が思い浮かびません...)

     
    • Yutaka Yanoh

      Yutaka Yanoh - 2012-12-17

      ご提案ありがとうございます。

      たしかに識別子の重複が見つかった場合に、どの識別子と衝突しているかを出力していなかったため、警告の原因が不明確になっていました。

      ご例示いただいた W0492 警告を含め、識別子 / 宣言 / 定義の衝突に関する下記の警告について、該当警告の直後に C0001 「この識別子 `...' で警告を検知しました。」メッセージを出力するよう改善いたしました。

      W0051 extern な識別子がリンカ特性で指定した長さで区別できない
      W0052 識別子がコンパイラ特性で指定した長さで区別できない
      W0491 宣言の識別子が他の名前空間内の識別子と衝突
      W0492 構造体メンバの識別子が他の識別子と衝突
      W0703 タグ名がより有効範囲の広い他の識別子を隠蔽
      W0704 宣言の識別子がより有効範囲の広い他の識別子を隠蔽
      W0770 extern な識別子を二箇所以上で宣言 (クロスモジュール解析)
      W0771 グローバルな識別子を二箇所以上で宣言
      W0787 異なるスコープでの宣言に互換性が無い
      W0788 同じスコープでの宣言に互換性が無い
      W0789 より広いスコープでの宣言に互換性が無い
      W0790 グローバルな識別子を二箇所以上で定義
      W0791 グローバルな識別子を二箇所以上で定義 (クロスモジュール解析)
      W1037 同一識別子の複数の宣言に互換性が無い (クロスモジュール解析)
      

      本対応を AdLint 2.6.14 に盛り込み、本日リリースいたしました。

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

       

Log in to post a comment.