未初始化的变量可能具有不确定的值,因为this回答了之前的问题。有没有办法指定这个不确定的数据,比如重复0xDEADDEAD
?不确定的数据显然是特定于编译器的,但强迫它成为易于识别的东西总是很好。
现有的内存泄漏/损坏检测库是否允许这样做?在某些情况下,重载new
似乎是一种解决方案,但我宁愿不自己深入研究这种技巧。
问题是不确定的值通常会导致代码的未定义行为,并且很少出现运行时错误,因此,例如,我想知道我是否忘记了代码中的memset()
。甚至可能随机化不确定值也可以作为测试平台。
如果无法做到这一点,是否有更好的方法来解决问题?
答案 0 :(得分:0)
以下是生成高质量C代码的一些指导原则:
答案 1 :(得分:0)
在运行时检查变量值的模式有点棘手。如你所说,它依赖于编译器/体系结构。
通常,静态分析工具可以为您提供有关未初始化变量的警告。以下是您可以使用的免费静态代码检查器:cppcheck。
答案 2 :(得分:0)
存在不确定的值,存在内存管理错误,并且存在两者的交集。
我不知道,如果有任何C / C ++编译器为不确定的值做了什么。 (我为可以说是类似C的并行语言构建的编译器有一个显式的调试开关,它将每个未分配的变量填入一个设计为“引起麻烦”的值,例如,对于int,-2 ^ 31,对于指针,特定的非空值来保证导致内存访问错误等。我怀疑你的里程会因编译器而有所不同。
内存管理非常困难。在C ++中,您可以定期使用构造函数和析构函数来确保不会发生许多此类错误,请参阅stackoverflow.com/questions/76796/memory-management-in-c
C更难,仔细检查您的代码,并确保每个例程对分配,解除分配或两者都没有帮助。
对于C和C ++,您可以使用静态分析工具(Coverity,Fortify)来检测许多此类分配错误。同样,您可以使用动态分析工具,例如Valgrind,它可以监视目标代码的作用,并在发生某些内存管理错误时停止它。仅限C,您可以使用我们的动态分析CheckPointer工具;它将检测valgrind检测到的所有错误以及更多错误(例如,valgrind无法检测到本地数组之外的访问[在堆栈中分配的一个]; CheckPointer可以)。