我可以给一个解决方案。
但是:
的努力可能比人工检测大得多。几乎所有适合程序员的IDE都允许您查看给定变量的所有引用。
这可能不适用于任何情况,您需要专门针对某些类型。
这将通过单个程序运行收集。
这个想法是包装你的数据类型。通过这种封装,您可以计算每个读取操作。 请参阅:
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()
后打印。您可以将这些数据收集到一些外部文件。
[这里是一个列表](http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B)用于C和C++的静态分析工具。他们中的一些人可能能够检测到你的情况。 –
哦,我有很多这些。不能被打扰修复它们。与DID需要修复的其他大规模开发工作相比,除非嵌入式代码具有有限的内存(这种情况下,我将消除所有未使用的内存位),否则这对于我来说是一个微不足道的问题。 –