1

コンパイラは、関数のスコープ内で未使用の変数を検出します。しかし、構造体の内部で定義された、一度も読み取られない変数が多数あることがわかりました (ただし、何度も書き込まれた可能性があります)。そのような未使用の変数を検出するためのツール/アナライザーまたはコンパイラー フラグさえありますか?

例: たとえば、次の構造の場合:

typedef struct jj_t {
    int count;
    int *list;
} jj;

アナライザーはcount、コードのどこにも読み取られていないことを検出する場合があります。

私のコードの分析は、これが頻繁に起こることを示しています! これは私のせいですが、長年にわたってさまざまなユーザーによって開発されたアプリケーションの一般的なケースかもしれません。これらの変数を削除すると、メモリ使用量が大幅に削減される場合があります。そのような変数を検出するためのツールが必要なだけで、手動で削除します。

前もって感謝します。

4

3 に答える 3

1

私は1つの解決策を与えることができます。

しかし:

  1. その労力は、おそらく手作業でチェックするよりもはるかに大きいでしょう。プログラマー向けのほとんどすべての優れた IDE では、特定の変数へのすべての参照を表示できます。

  2. これはおそらくすべての場合に機能するとは限りません。いくつかのタイプに特化する必要があります。

  3. これは、1 回のプログラム実行で収集されます。

アイデアは、データ型をラップすることです。このようなカプセル化により、すべての読み取り操作をカウントできます。見る:

template <class T, class Parent, int NO=1>
class TReadDetector {
public:
   struct Data {
      bool touched;
      Data () : touched(false) {}  
      ~Data ()  {
        if (!touched) 
          std::cerr << typeid(*this).name() << ": not read!!!\n" << std::endl;
      }  
   };
   static Data  data;
   TReadDetector () {}
   TReadDetector (const T& t) : t(t) {}
   operator T () const {    data.touched = true; return t; }
   TReadDetector& operator = (const T& t) { this->t = t; }
private:
   T t;
};

template <class T, class Parent, int NO>
typename TReadDetector<T,Parent,NO>::Data  
                       TReadDetector<T,Parent,NO>::data;

そして使用法:

それ以外の:

struct A {
  int a;
  int b;
};

これを行う:

struct A {
  TReadDetector<int,A, 1> a;
  TReadDetector<int,A, 2> b;
};


int main() {
  A a;
  a.a = 7;
  a.b = 8;
  std::cout << a.a << std::endl;
  std::cout << TReadDetector<int,A, 1>::data.touched << std::endl;
  std::cout << TReadDetector<int,A, 2>::data.touched << std::endl;
  std::cout << "main() ended" << std::endl;
};

結果は次のようになります。

7
1
0
main() ended
N13TReadDetectorIi1ALi2EE4DataE: not read!!!

の後に出力される最後の行に注意してくださいmain()。このデータを外部ファイルに収集できます。

于 2012-09-25T17:12:22.543 に答える
1

分析は、翻訳単位全体で行う必要があります。

実際には、あなたとは異なり、これが問題になることはありません。私が考えることができる唯一の解決策は、メンバーを 1 つずつ削除し、アプリケーション全体がまだコンパイルされるかどうかを確認することです。

于 2012-09-25T15:54:28.587 に答える
-1

構造体からフィールドを削除すると、次のような構造体を使用した場合、まれに危険な場合があります。

typedef struct jj_t {     int count;     int *list; } jj; 

jj *ptr = malloc (...);

//....

*ptr = 5; // NAIVE (but I have seen usage like this).
          // Actually you are not modifying count, count was already deleted.

したがって、あなたが求めていた分析を行うのは非常に困難です。

于 2012-09-25T17:06:49.880 に答える