【问题标题】:Interpreting valgrind error解释 valgrind 错误
【发布时间】:2011-08-01 13:35:10
【问题描述】:

我正在尝试使用 valgrind 调试我的代码。我收到的大部分信息是:

Conditional jump or move depends on uninitialised value(s)

Invalid read of size 8

我主要关心第一个,如果该值确实未初始化,我相信会发生分段错误。我通过向另一个函数发送相同的指针以及指向我知道会引发分段错误的函数的未初始化指针来测试这一点,并且只有真正未初始化的指针会导致分段错误。

此错误消息的含义也可能是什么。

另外,第二个错误是什么意思?

编辑1
这是一个模型代码,会不会给出错误1(假设头文件是合法的)?

a.cpp

B b;
C c;
int main(){
  return 0;
}

B.cpp

extern C c;
//    double t; //canceld, declared in the header.
B::B(){
  this->t = 1;
  c.test(t);
}
B::test(){
  c.test(this->t);
}

B.cpp

C::C(){
}

C::test(double t){
  printf("%f\n",t);
}

【问题讨论】:

  • valgrind 是否指向特定的代码行?查看它标记的代码的一些示例会很有帮助。第一个可能不一定与指针有关,但可以是您未初始化但随后在条件语句中使用的任何变量。
  • 我对 valgrind 的体验是“当它指示错误而我看不到它时”我只是误读了错误和/或代码,而 valgrind 实际上是正确的。
  • @unluddite,是的。在我把它放入我的代码之前,是否有可能给出这条消息,因为我在传递的指针上使用的函数实际上属于一个在我调用函数后初始化的类? (我在我的问题中放了一个模型伪代码)
  • @Mark B,这对应于我的编辑和评论。我的问题是如何理解这些错误。
  • @Yotam - 如果您从 B 的构造函数中调用 test(),那将是一个问题。否则听起来更像是你有一个if (x > 5),而x 没有价值。那不会有段错误。

标签: c++ debugging valgrind


【解决方案1】:
Conditional jump or move depends on uninitialised value(s)

这意味着您正在尝试对未初始化的变量执行某些操作。例如:

int main()
{
    int x;
    if (x == 5)
        printf("%d\n", x);
    return 0;
}

应该可以解决问题。您无法比较/打印或对未初始化的变量执行某些操作。

Invalid read of size 8

这意味着您正在尝试从不存在的内存中读取,即尚未分配。

int main()
{
    char* x = malloc(10);
    x[10] = '@';    //this is an invalid write
    printf("%c\n", x[10]); //this is an invalid read
    return 0;
}

会导致错误,因为您只为 10 个字符分配了空间,但您在第 11 个字符处写入/读取(请记住,数组的索引为 0,因此您只能写入 0-9)。

“size X”通常是您尝试读取的内存量,因此 size 8 表示您正在尝试读取 8 个字节。

希望对您有所帮助。如果您需要调试帮助,请发布更具体的代码。 Valgrind 通常会告诉您错误发生的位置,以便您弄清楚该怎么做。

【讨论】:

  • 在这种情况下,我们可以猜测双精度数为 8 个字节。
  • 谢谢,问题是在这两种情况下,代码都会通过这些错误编译(不足为奇)和运行(令人惊讶),据我所知,错误是由我的类引起的m 用于运行函数,而不是通过我传递给函数的元素。我的实际分段错误是由完全不同的东西引起的,我想先理清垃圾错误。
  • @ Yotam - 这可能是您传递的元素。通常,valgrind 会说错误来自bar 类中的函数foo(),而实际上是您传递给foo 的参数导致了错误。如果您可以发布代码,我们可以为您提供更多帮助。
  • @BlackJack,我知道我传递的元素是有效的(我已经测试过了)。
猜你喜欢
  • 2016-01-16
  • 1970-01-01
  • 2018-09-27
  • 2014-12-13
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多