3

正如前面问题的答案所指出的,未初始化的变量可能具有不确定的值。有没有办法指定这个不确定的数据,比如说,重复0xDEADDEAD?不确定的数据显然是特定于编译器的,但将其强制为易于识别的东西总是很好的。

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

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

如果这是不可能的,是否有更好的方法来解决问题?

4

3 回答 3

0

有不确定的值,有内存管理错误,还有两者的交集。

我不知道如果 C/C++ 编译器为不确定的值做了什么。(我为类似 C 的并行语言构建的编译器有一个显式调试开关,它用一个旨在“引起麻烦”的值填充每个未分配的变量,例如,对于整数,-2^31,对于指针,特定的非空值保证会导致内存访问错误等)。我怀疑您的里程会因编译器而异。

内存管理是出了名的困难。在 C++ 中,您可以以常规方式使用构造函数和析构函数,以确保不会发生许多此类错误,请参阅 stackoverflow.com/questions/76796/memory-management-in-c

C 更难,仔细检查您的代码,并确保每个例程对分配、释放或两者都没有帮助有明确的责任。

对于 C 和 C++,您可以使用静态分析工具(Coverity、Fortify)来检测许多此类分配错误。同样,您可以使用动态分析工具,例如 Valgrind,它会监视您的目标代码所做的事情,并在发生一些内存管理错误时停止它。仅对于 C,您可以使用我们的动态分析CheckPointer工具;它将检测 valgrind 检测到的所有错误以及更多错误(例如,valgrind 无法检测到本地数组之外的访问[在您的堆栈中分配的数组];CheckPointer 可以)。

于 2012-06-02T10:20:21.583 回答
0

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

  1. 创建/使用有助于避免内存错误(和其他类型的错误)的编码指南。网上有很多例子。最好的方法是查看 5 或 6 并将其编译为一个,只保留适合需要的内容。
  2. 使用代码审查/检查来查找错误并检查对编码指南的遵守情况。代码审查是查找工具无法检测到的错误的最佳方法之一。代码审查对于初学者/中级程序员来说尤为重要,因为它增加了您的学习曲线,无论是在您审查其他人编写的代码时,还是在您被审查时。
  3. 使用可以自动运行的测试用例测试您的代码。
  4. 使用 valgrind 之类的工具来查找多种类型的错误。
于 2012-06-02T09:08:28.620 回答
0

在运行时检查变量值的模式有点棘手。正如你所说,它依赖于编译器/架构。

通常静态分析工具可以给你关于未初始化变量的警告。这是您可以使用的免费静态代码检查器:cppcheck

于 2012-06-02T09:31:52.220 回答