是否可以在C / C ++中定义/加扰不确定值以进行调试?

时间:2012-06-02 06:06:41

标签: c++ c

未初始化的变量可能具有不确定的值,因为this回答了之前的问题。有没有办法指定这个不确定的数据,比如重复0xDEADDEAD?不确定的数据显然是特定于编译器的,但强迫它成为易于识别的东西总是很好。

现有的内存泄漏/损坏检测库是否允许这样做?在某些情况下,重载new似乎是一种解决方案,但我宁愿不自己深入研究这种技巧。

问题是不确定的值通常会导致代码的未定义行为,并且很少出现运行时错误,因此,例如,我想知道我是否忘记了代码中的memset()。甚至可能随机化不确定值也可以作为测试平台。

如果无法做到这一点,是否有更好的方法来解决问题?

3 个答案:

答案 0 :(得分:0)

以下是生成高质量C代码的一些指导原则:

  1. 创建/使用有助于避免内存错误(以及其他类型的错误)的编码指南。互联网上有很多例子。最好的方法是看看5或6并将其编译成一个,只保留符合 需求的内容。
  2. 使用代码审查/检查来查找错误并检查是否符合编码指南。代码审查是查找工具无法检测到的错误的最佳方法之一。代码评审对于初学者/中间程序员来说非常重要,因为它会增加您的学习曲线,无论是在您查看其他人编写的代码还是您正在审核的代码时。
  3. 使用可以自动运行的测试用例测试您的代码。
  4. 使用像valgrind这样的工具来查找许多类型的错误。

答案 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可以)。