如何在运行时检查指针变量是否是垃圾?

时间:2012-09-12 10:01:14

标签: c pointers valgrind conditional-breakpoint

我使用valgrind来验证我的代码,它在我的一个函数中报告“条件跳转或移动取决于未初始化的值”,它将一个指针数组作为参数。

现在,如何在运行时检查数组是否包含垃圾值(可能使用条件断点)?说,我不访问指针,因此程序不会中断。

要检查以识别垃圾指针的条件是什么?

4 个答案:

答案 0 :(得分:3)

虽然其他答案是正确的,但您也可以获得valgrind来帮助您确定阵列中的哪个或哪些条目确实导致了问题。

你需要做的是在程序中添加循环数组的代码(当然你可能已经有了这样的循环)然后包含valgrind/memcheck.h并在循环中添加这样的东西:

if (VALGRIND_CHECK_VALUE_IS_DEFINED(entry)) {
  printf("index %d undefined\n", index);
}

其中entry是数组中的实际值,index是arry中该值的索引。

答案 1 :(得分:2)

您无法区分有效指针和垃圾(未初始化)指针,它们都只是数字。

您在代码中的某个位置处理“垃圾”指针的事实表明,在达到该点之前存在问题。

答案 2 :(得分:1)

您需要系统地将所有指针初始化为NULL。 当您释放内存时,也将指针重置为NULL。 这可以使用包含malloc / free的“constructor / destructor”函数来完成。 只有这样,你才能测试NULL值指针,看看是否出现了问题。

答案 3 :(得分:1)

您不测试垃圾,您在创建阵列的时间和第一次考虑使用这些值之间的某个时刻将非垃圾值放入数组中。通常在创建数组时执行此操作:

const char* strings[] = {0, "junk", "here"};
int some_values[10] = { 0 };

Valgrind使用自己的技巧来识别它认为是垃圾的东西,但这些技巧超出了标准的范围,而常规C代码不能使用它们(或者无论如何都不应该尝试)。即使你可以以某种方式挂钩valgrind所做的事情,你最终会得到的代码不适用于所有实现,或者仅在valgrind下运行时才有效。