Обнаружение неиспользуемых переменных за пределами области действия функции

Компиляторы обнаруживают неиспользуемые переменные в пределах функции. Тем не менее, я обнаружил, что есть много переменных, определенных внутри структуры, которые никогда не читаются (но, возможно, были написаны много раз). Есть ли какой-либо инструмент / анализатор или даже флаги компилятора для обнаружения таких неиспользуемых переменных?

Пример:
Например, в следующей структуре:

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

Анализатор может обнаружить, что count никогда не читается нигде в коде.

Мой анализ моего кода показывает, что это часто случается! Это была моя ошибка, но, может быть, это общий случай для приложений, разработанных разными пользователями за эти годы. Удаление этих переменных может значительно сократить использование памяти. Мне просто нужен инструмент для обнаружения таких переменных, и я буду удалять их вручную.

Заранее спасибо.

1

Решение

Я могу дать одно решение.

Но:

  1. Усилие, вероятно, намного больше, чем проверка вручную. Почти каждая хорошая IDE для программистов позволяет видеть все ссылки на данную переменную.

  2. Это, вероятно, не будет работать в каждом случае, вам нужно будет специализироваться для некоторых типов.

  3. Это будет собираться при запуске одной программы.

Идея состоит в том, чтобы обернуть ваши типы данных. С такой инкапсуляцией вы можете считать каждую операцию чтения.
Увидеть:

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(), Вы можете собрать эти данные в какой-то внешний файл.

1

Другие решения

Любой анализ должен проходить через переводческие единицы.

На практике, в отличие от вас, я никогда не считал это проблемой. Около
Единственное решение, которое я могу придумать, это удалить участников по одному
один, и посмотреть, если все приложение все еще компилируется.

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.

Так что очень сложно провести анализ, о котором вы просили.

-1
По вопросам рекламы [email protected]