检测超出函数范围的未使用变量

时间:2012-09-25 15:47:59

标签: c++ c optimization unused-variables

编译器在函数范围内检测未使用的变量。但是,我发现在结构中定义了许多变量,这些变量从未被读取(但可能已被多次写入)。是否有任何工具/分析器甚至编译器标志来检测这些未使用的变量?

实施例: 例如,在以下结构中:

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

Analyzer可能会发现count永远不会在代码中的任何位置读取。

我对我的代码的分析表明这种情况经常发生!这是我的错,但这可能是不同用户多年来开发的应用程序的常见情况。删除这些变量可能会显着减少内存使用量我只需要一个工具来检测这些变量,我会手动删除它们。

提前致谢。

3 个答案:

答案 0 :(得分:1)

任何分析都必须与翻译单位相对应。

在实践中,与你不同,我从未发现这是一个问题。关于 我能想到的唯一解决方案是逐个删除成员 一,看看整个应用程序是否仍在编译。

答案 1 :(得分:1)

我可以给出一个解决方案。

可是:

  1. 努力可能比手工检查要大得多。几乎所有适合程序员的IDE都允许您查看对给定变量的所有引用。

  2. 这可能不适用于所有情况,您需要专门针对某些类型。

  3. 这将由单个程序运行收集。

  4. 我们的想法是包装您的数据类型。通过这种封装,您可以计算每次读取操作。 参见:

    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()之后打印的最后一行。您可以将此数据收集到某个外部文件中。

答案 2 :(得分:-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.

因此,很难进行您要求的分析。